Win32:获取其他应用程序关闭/退出的消息通知

时间:2009-05-16 12:44:34

标签: windows winapi visual-c++

我的应用程序需要监视系统上所有其他正在运行的应用程序。有没有办法在退出每个应用程序exe时得到通知?

我能找到的方法:

1)使用PSAPI函数以频繁的间隔获取正在运行的exes列表。在每次轮询中与上一个列表进行比较,以找出退出的应用程序/进程。 缺点:需要不断轮询,需要占用CPU时间。

2)为WM_CLOSE消息设置一个全局钩子:使用这个我可以通过标题栏上的关闭按钮关闭任何应用程序时收到通知

缺点: ( - )并非所有应用程序都生成WM_CLOSE消息(例如:Total Video Player Exe) ( - )如果通过“退出”菜单或按钮(例如文件 - >退出)关闭了应用程序,我无法捕获该消息

我错过了还有其他更好的方法吗?请指教。

4 个答案:

答案 0 :(得分:8)

  1. 使用PSAPI获取PID列表。
  2. 然后使用OpenProcess()处理每个流程。
  3. 当其中一个进程退出时,使用WaitForMultipleObjects()发出信号。

答案 1 :(得分:2)

您可以尝试使用RegisterShellHookWindow()API并过滤HSHELL_WINDOWCREATED和HSHELL_WINDOWDESTROYED消息。

当然,这只会让您收到有关窗口的应用程序的通知。

答案 2 :(得分:1)

我最近遇到了这个问题并找到了一个解决方案,所以想与大家分享。这一切都纠正了我们应该获得流程的方式。而不是WaitForSingleOBject,我建议使用RegisterWaitForSingle对象函数。使用此函数,您将提供回调函数,每当进程退出时,将调用您的回调函数。这比在线程中调用WaitForSingleObject要好。在代码中单独调用WaitForSingleObject将导致代码等待进程退出。以下是如何调用它的示例:

RegisterWaitForSingleObject(&waitHandle, processHandle, ProcessTerminatedCallback, param, INFINITE, WT_EXECUTEONLYONCE);

其中: [out] waitHandle - 为您创建的新句柄。请注意,您不能使用此句柄来调用CloseHandle,但如果您愿意,可以等待它。

[in] processHandle - 处理你应该自己获得的进程

[in] ProcessTerminatedCallback - 进程退出时将调用的回调函数

[in] param - 将传递给回调的LPVOID参数

[in] INFINITE - 无限期等待或指定时间,查找MSDN以获取更多信息

[in] WM_EXECUTEONLYONCE - 只会调用一次回调函数。查找MSDN以获取更多信息

答案 3 :(得分:-1)

>还有其他更好的方式我错过了吗?

是的,很多。请参阅Win32 group(系统通知,没有任何挂钩)