1

我有一个需要通过自动关闭来响应更新调用的 VB6 应用程序。关闭应用程序不需要用户交互。除了打开系统对话框外,这一切都很好。此对话框可用于打开文件或设置打印机属性。像这样的东西:


(来源:tweakers.net

“打印设置”窗口仍会正常关闭,但属性对话框是一个系统对话框,在我的程序关闭时不会关闭。结果是应用程序不会关闭,但仍(不可见)处于活动状态。我必须使用任务管理器强制关闭它。

可以使用如下代码检测打开的表单:

For Each Form In Forms
    ...
Next Form

这些对话框不会出现在这个打开的表单数组中。有没有办法检测我的应用程序打开的所有系统对话框并以有序的方式关闭它们?

4

4 回答 4

1

作为一个巨大的黑客,您可以尝试调用Sendkeys "{esc}"直到您的表单获得按键事件。

于 2012-04-18T14:57:18.770 回答
1

另一个选项只是推迟关闭直到对话框关闭(您知道何时显示它以及何时返回,所以一个简单的标志就可以了)。

于 2012-04-18T14:58:22.950 回答
1

我没有时间设计一个完整的答案,但这里有一些提示。

一种解决方案可能

  1. 遍历属于您的 VB6 程序的所有顶级窗口
  2. 找到每个的 hWnd
  3. 使用 PostMessage 向每个人发送WM_CLOSE 。

Karl Peterson 有一篇文章 ,其中包含遍历属于当前线程的所有窗口并确定它们的 hWnd 的代码。

带上你的斧头!:)

于 2012-04-17T19:45:44.427 回答
1

半回答我自己的问题。我仍在寻找更好的解决方案,但到目前为止这已经成功了。

我使用EnumWindowswithIsWindowVisible来获取所有可见窗口的 Hwnd。然后我用来GetAncestor从祖先形式(开放形式)中获取 Hwnd。我通过遍历所有表单来检查该祖先 Hwnd 是否属于我自己的应用程序。如果它属于我的应用程序,我会使用 WM_CLOSE by 关闭窗口PostMessage

这可能不是最好的解决方案,因为我需要从所有正在运行的应用程序中遍历所有打开的窗口。如果有人有更好的解决方案,那么我喜欢听听。简单地为我自己的应用程序提供打开窗口的 Hwnd 可能会加快速度。

于 2012-04-18T12:10:10.460 回答