如何在没有显示模态对话框的情况下关闭应用程序?

时间:2011-11-24 23:35:48

标签: delphi message sendmessage findwindow

我有一个应用程序,可以选择在创建PDF后打开它们。如果两个报告连续生成相同的名称,如果第一个acrobat副本仍然打开PDF,则第二次尝试失败,因此在我编写PDF之前,我检查(使用FindWindow)具有文档名称的窗口。如果找到一个,我发出SendMessage WM_Close。

这样可以正常工作,但我正在做一些其他测试,并且正在使用Word来“编辑”PDF,将其保持打开状态,以便在无法编写PDF文件时测试应用程序的行为。现在,当我的应用程序试图关闭窗口时,Word会弹出一个“你想要保存”对话框。如果我单击取消,Word仍然打开,我的应用程序继续运行,我可以测试它在遇到无法写入的文件时表现得理智。

一切都很好,但它已经提醒我,使用SendMessage WM_CLOSE关闭另一个应用程序将会阻止我的应用程序,如果其他应用程序弹出模式对话框。有没有办法解决这个问题 - 即关闭其他应用程序的更有力(但不是太强大)的方式?或者“关闭并在必要时单击取消”。或者我应该使用异步消息吗?

3 个答案:

答案 0 :(得分: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...
 

答案 1 :(得分:4)

我根本不会关闭其他应用程序。我认为最好在生成报告之前删除当前文件。如果失败(DeleteFile),则向用户显示一条消息,即该文件无法被覆盖(因为它由另一个程序打开)并且根本不生成报告。这样更安全,因为您将选项留给用户。此外,如果程序是由另一个没有在窗口标题中显示标题的程序打开的话,这会让您免于重大的麻烦吗?

答案 2 :(得分:2)

如果您想比WM_CLOSE更进一步,则只能终止申请。其他一切都会像彩票一样。

那说我反对。如果您的PDF在已显示其他文档的MDI应用程序中打开怎么办?强制关闭应用程序会使用户丢失对其他打开文档的所有更改。并且向该应用程序发送关闭消息将是令人讨厌的,因为用户仍然需要打开其他文档。

您无法预测每个应用程序的行为。你肯定不知道每个应用程序。如果报告具有相同的名称,则可以告诉用户关闭具有相同名称的另一个报告。否则他不会得到新的报告。想想如果Windows在您尝试覆盖当前正在使用的文件时就开始关闭应用程序会发生什么。