【问题标题】:Windows Explorer does not receive WM_DESTROY. How can I detect when the user closes their explorer window?Windows 资源管理器不接收 WM_DESTROY。如何检测用户何时关闭其资源管理器窗口?
【发布时间】:2013-06-01 01:21:51
【问题描述】:

我正在编写一个需要检测窗口何时关闭的程序。目前我正在使用 SetWindowsHookEx 注册一个可以监控窗口消息的钩子。

我正在监视 WM_DESTROY 事件以找出窗口何时被破坏。这适用于大多数窗口,Windows Explorer 是一个明显的例外。 Windows 资源管理器在终止时似乎没有收到 WM_DESTROY 事件(但会收到大多数其他有趣的事件)。

Windows 资源管理器没有收到 WM_DESTROY 是否有原因?

更重要的是,除了侦听 WM_DESTROY 之外,我是否可以使用其他方法来检测 Windows 资源管理器何时终止?

谢谢!

我使用的是 Windows 7(不确定此信息的相关性)

【问题讨论】:

  • 很难为这个问题创建一个建设性的答案。当然,WM_DESTROY 通常在窗口被销毁时发送。但窗户破坏不一定是正常的。例如,当进程终止时,Windows 销毁窗口时不会发送任何内容。 Explorer 并没有什么不寻常的地方,18 年的 appcompat hack 以保持流行的 shell 扩展运行看到了这一点。以及资源管理器具有的额外特殊选项,“在自己的进程中运行窗口”选项。大量的东西合谋使您的代码无效。
  • 这是否意味着我一般不能依赖 WM_DESTROY 消息?我真的必须求助于定期轮询 EnumWindows 并检查哪些窗口不再存在吗?

标签: winapi hook windows-explorer setwindowshookex


【解决方案1】:

使用WH_CBT 挂钩而不是消息挂钩,并让它处理HCBT_DESTROYWND 通知。

【讨论】:

  • 我刚刚尝试过,但它不起作用。与 WM_DESTROY 一样,我从其他窗口收到 HCBT_DESTROYWND 通知,但从 Windows 资源管理器没有收到通知。
  • 那么窗口没有被破坏。它很可能只是被隐藏起来,供同一个 explorer.exe 进程稍后重新使用。打开新的 Windows 资源管理器窗口并不总是会启动新的 explorer.exe 进程。
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2018-07-28
相关资源
最近更新 更多