【问题标题】:How can I close an app without a modal dialog box being shown?如何在不显示模式对话框的情况下关闭应用程序?
【发布时间】:2011-11-24 23:35:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi message sendmessage findwindow


    【解决方案1】:

    不要强制关闭任何应用程序,可能还有其他文件正在打开用户正在查看等...您可以使用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...
     
    

    【讨论】:

      【解决方案2】:

      我根本不会关闭其他应用程序。我认为最好在生成报告之前删除当前文件。如果失败 (DeleteFile),向用户显示无法覆盖文件的消息(因为它已被另一个程序打开)并且根本不生成报告。这更安全,因为您将选择权留给了用户。这也使您免于头疼,如果该程序被另一个未在窗口标题中显示标题的程序打开怎么办?

      【讨论】:

        【解决方案3】:

        如果您想比WM_CLOSE 更进一步,您只能终止应用程序。其他一切都像彩票一样。

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

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

        【讨论】:

        • 同意。我认为@Sertac 的回答很有道理,超时消息的逻辑在我的应用程序中运行良好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 2018-09-12
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        相关资源
        最近更新 更多