2013-06-01 83 views
2

我正在编写一个程序,需要检测何时关闭窗口。目前我使用SetWindowsHookEx来注册一个可以监视窗口消息的钩子。Windows资源管理器不会收到WM_DESTROY。如何检测用户何时关闭资源管理器窗口?

我正在监视WM_DESTROY事件以查明Windows何时被销毁。这对于Windows资源管理器是一个显着的例外是大多数Windows工作正常。 Windows资源管理器在终止时看起来没有收到WM_DESTROY事件(但收到大多数其他有趣的事件)。

Windows资源管理器没有收到WM_DESTROY的原因是什么?

更重要的是,有没有一种替代方法可以用来检测Windows资源管理器终止而不是侦听WM_DESTROY?

谢谢!

我使用Windows 7(不知道这个信息的相关程度)

+0

很难为这个问题创建一个有建设性的答案。当然,WM_DESTROY *通常会在窗口被销毁时发送。但窗户破坏不一定是正常的。例如,当进程终止时,Windows破坏窗口时,不会发送任何消息。关于资源管理器,没有什么正常的,18年的appcompat黑客保持流行的shell扩展运行看到这一点。还有Explorer提供的额外特殊选项,即“在自己的进程中运行窗口”选项。大量的东西来密谋让你的代码无效。 –

+0

那么这是否意味着我不能依赖一般的WM_DESTROY消息?我真的不得不采取一些措施,例如定期轮询EnumWindows并检查哪些窗口不再存在? – TomPeters

回答

2

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

+0

我刚试过这个,但没有奏效。与WM_DESTROY一样,我从其他窗口收到HCBT_DESTROYWND通知,但没有收到来自Windows资源管理器的通知。 – TomPeters

+0

然后窗口不被破坏。它可能只是隐藏起来,以供以后由相同的explorer.exe进程重新使用。打开一个新的Windows资源管理器窗口并不总是启动一个新的explorer.exe进程。 –