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

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

我可以find的方法:

1)使用PSAPI函数以频繁的间隔获取正在运行的ex的列表。 在每个民意调查比较与以前的清单,以find哪个应用程序/进程已退出。 缺点:需要不断的轮询,会花费CPU时间。

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

缺点:( – )不是所有的应用程序都生成一个WM_CLOSE消息(例如:总video播放器EXE)( – )如果通过“退出”菜单或buttonclosures应用程序(例如文件 – >退出),我不能捕获该消息

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

Solutions Collecting From Web of "Win32:获取其他应用程序closures/退出的消息通知"

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

您可以尝试RegisterShellHookWindow ()API并筛选HSHELL_WINDOWCREATED和HSHELL_WINDOWDESTROYED消息。

当然,这只会让你知道有窗口的应用程序。

我最近遇到这个问题,发现一个解决方案,所以想与大家分享。 这一切正确的方式,我们应该得到处理的过程。 虽然不是WaitForSingleOBject,但我建议使用RegisterWaitForSingle对象函数。 有了这个函数,你正在给一个回调函数,每当进程退出,你的回调函数将被调用。 这比在线程中调用WaitForSingleObject要好。 在代码中调用WaitForSingleObject本身会导致代码等待进程退出。 这是一个如何调用它的例子:

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

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

processHandle – 处理你应该获得的进程

ProcessTerminatedCallback – 当进程退出时将被调用的回调函数

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

[in] INFINITE – 无论是等待无限还是指定的时间,请查阅MSDN了解更多信息

[in] WM_EXECUTEONLYONCE – 只会调用回调函数一次。 查阅MSDN了解更多信息

>有没有其他更好的方法,我错过了?

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