モーダルダイアログボックスを表示せずにアプリを閉じるにはどうすればよいですか?

私はオプションでそれを作成した後PDFを開くことができるアプリがあります。 2つのレポートが同じ名前で連続して生成された場合、Acrobatの最初のコピーにまだPDFが開いていれば2番目の試行は失敗しますので、PDFを書き込む前にドキュメント名のウィンドウを(FindWindowで)チェックします。見つかった場合、私はSendMessage WM_Closeを発行します。

これは正常ですが、私はいくつかのテストを行っていましたが、PDFを編集するためにWordを使用していましたので、PDFファイルを書き込めないときにアプリケーションの動作をテストすることができました。さて、私のアプリがウィンドウを閉じようとすると、「保存しますか?」というダイアログが表示されます。私がキャンセルをクリックすると、Wordは開いたままになり、私のアプリは続行し、書き込めないファイルに遭遇したらそれが賢明に動作することをテストできます。

すべて良いですが、別のアプリを閉じるためにSendMessage WM_CLOSEを使用すると、他のアプリがモーダルダイアログをポップすると私のアプリが邪魔になります。これを回避する方法はありますか?つまり、他のアプリを閉じるより強力な(しかしあまりにも強力な)方法はありませんか?または、「必要に応じて閉じる」をクリックしてキャンセルします。または、非同期メッセージを使用する必要がありますか?

4

3 答え

アプリケーションを強制終了しないでください。開いている他のドキュメントが表示されている可能性があります。 WM_CLOSE の復帰を賢明な時間待つようにしてから、いずれかの失敗を続行するには、" ms644952%28v = vs.85%29.aspx "> SendMessageTimeout または成功...

var
  Word: HWND;
  msgResult: DWORD;
begin
  ...

  SendMessageTimeout(Word, WM_CLOSE, 0, 0, SMTO_NORMAL, 5000, msgResult);
  if IsWindow(Word) then begin
   //bummer! Application is open...
 
7
追加された

私は他のアプリケーションをまったく閉じないでしょう。私は、レポートを生成する前に、現在のファイルを削除する方が良いと思います。それが失敗した場合( DeleteFile )、(別の​​プログラムによって開かれているため)ファイルを上書きできないというメッセージをユーザに表示し、レポートをまったく生成しません。これは、ユーザーにオプションを残すので、はるかに安全です。また、これは、大きな頭痛からあなたを保存する場合、プログラムは、ウィンドウのキャプションにタイトルを表示しない別のプログラムによって開いている場合はどうなりますか?

4
追加された
ねえ、良い考え方
追加された 著者 rossmcm,

WM_CLOSE より一歩進めたい場合は、アプリケーションを終了するだけです。他のすべては宝くじのようになります。

それは私が両方に反対していると言いました。あなたのPDFが他のドキュメントを表示しているMDIアプリケーションで開くとどうなりますか?アプリケーションを強制的に閉じると、開いている他の文書に対するすべての変更が失われます。また、このアプリケーションに近いメッセージを送信すると、ユーザーはまだ他の文書を開く必要があるため、迷惑になります。

すべてのアプリケーションの動作を予測することはできません。そして、あなたは確かにすべてのアプリケーションを知らない。同じ名前のレポートの場合、同じ名前の別のレポートを閉じるようにユーザーに指示できます。さもなければ、彼は新しい報告を得ることはありません。現在使用されているファイルを上書きしようとするとすぐに、Windowsがアプリケーションを閉じ始めるとどうなるか考えてみてください。

2
追加された
合意した私は@ Sertacの答えが理にかなっていると思うし、タイムアウトしたメッセージのロジックは私のアプリケーションでうまくいく。
追加された 著者 rossmcm,