delphi - 如何在不显示模式对话框的情况下关闭应用程序?

标签 delphi message sendmessage findwindow

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

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

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

最佳答案

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

关于delphi - 如何在不显示模式对话框的情况下关闭应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263497/

相关文章:

delphi - 继续支持不同版本的软件,每个版本都使用不同的 Delphi 或组件版本构建

delphi - 是否有关于如何在 Delphi 中使用异常的视频/屏幕转换

jquery - Apprise 是一个很棒的插件,但有一个小问题。要改变什么?

java - SendMessage 从 Delphi 应用程序到 Java 应用程序 RICHEDIT50W 控件

google-chrome-extension - Chrome 扩展 - 从 DOM 到 Popup.js 消息传递

delphi - 在运行时创建复合控件(其他控件的父控件)

sql - 使用 SQL 获取非重复计数?

javascript - 如何手动通过 Youtube API 发送消息?

c# - ZeroMQ/ØMQ/0MQ 如何入门?

python - 将文本编码为 win32api.SendMessage() 的 WPARAM