4

PDFを作成した後、オプションでPDFを開くことができるアプリがあります。同じ名前で2つのレポートが連続して生成される場合、acrobatの最初のコピーでPDFが開いていると、2回目の試行は失敗します。そのため、PDFを作成する前に、(FindWindowを使用して)ドキュメント名のウィンドウを確認します。見つかった場合は、SendMessageWM_Closeを発行します。

これは問題なく動作しますが、他のテストを行っており、Wordを使用してPDFを「編集」し、PDFファイルを書き込めない場合のアプリの動作をテストできるように開いたままにしました。これで、アプリがウィンドウを閉じようとすると、Wordは「保存しますか」ダイアログをポップアップします。[キャンセル]をクリックすると、Wordは開いたままになり、アプリは続行され、書き込みできないファイルに遭遇したときに、アプリが適切に動作することをテストできます。

すべて良好ですが、SendMessage WM_CLOSEを使用して別のアプリを閉じると、他のアプリがモーダルダイアログをポップアップした場合に、私のアプリが引っ掛かるという事実を警告しました。これを回避する方法はありますか?つまり、他のアプリを閉じるためのより強力な(ただしあまり強力ではない)方法はありますか?または、「必要に応じて閉じてキャンセルをクリックしてください」。または、非同期メッセージを使用する必要がありますか?

4

3 に答える 3

7

アプリケーションを強制的に閉じないでください。ユーザーが表示している他のドキュメントが開かれている可能性があります... を使用して、適切な時間SendMessageTimeoutの戻りを待ってからWM_CLOSE、失敗または成功のいずれかを続行できます..

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...
 
于 2011-11-25T00:07:27.063 に答える
4

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

于 2011-11-25T07:49:38.360 に答える
2

さらに一歩先に進みたい場合はWM_CLOSE、アプリケーションを終了することしかできません。他のすべては宝くじのようになります。

つまり、私はどちらにも反対です。PDF が MDI アプリケーションで開かれ、既に他のドキュメントが表示されている場合はどうなりますか? アプリケーションを強制的に閉じると、ユーザーは他の開いているドキュメントへのすべての変更を失うことになります。また、ユーザーはまだ他のドキュメントを開く必要があるため、このアプリケーションに閉じるメッセージを送信するのは面倒です。

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

于 2011-11-25T00:12:14.123 に答える