如何关闭我自己的应用程序打开的对话框

时间:2012-04-17 09:06:21

标签: vb6 dialog

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

http://tweakers.net/ext/f/Kjz0R5IvkCNfXRRefrqHFmFc/full.png

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

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

For Each Form In Forms
    ...
Next Form

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

4 个答案:

答案 0 :(得分:1)

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

一个解决方案might

  1. 遍历属于VB6程序的所有顶级窗口
  2. 找到每个人的hWnd
  3. 使用PostMessage向每个人发送WM_CLOSE
  4. Karl Peterson有一个article代码,它遍历属于当前线程的所有窗口并确定它们的hWnd。

    带上你的斧头! :)

答案 1 :(得分:1)

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

我与EnumWindows一起使用IsWindowVisible来获取所有可见窗口的Hwnd。然后我使用GetAncestor从祖先形式(开始形式)获取Hwnd。我通过循环遍历所有表单来检查祖先Hwnd是否属于我自己的应用程序。如果它属于我的应用程序,则使用PostMessage的WM_CLOSE关闭窗口。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

另一种选择就是在关闭对话框之前暂停关闭(你知道什么时候显示它以及它什么时候返回,这样就会有一个简单的标志)。