Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Win32:获取其他应用程序的消息通知';s关闭/退出_Windows_Winapi_Visual C++ - Fatal编程技术网

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

Windows Win32:获取其他应用程序的消息通知';s关闭/退出,windows,winapi,visual-c++,Windows,Winapi,Visual C++,我的应用程序需要监视系统上所有其他正在运行的应用程序。是否有某种方式可以在退出每个应用程序时通知我 我能找到的方法是: 1) 使用PSAPI函数以频繁的间隔获取正在运行的EXE的列表。在每次轮询时,与上一个列表进行比较,以确定哪个应用程序/进程已退出。 缺点:需要持续轮询,需要CPU时间 2) 为WM_CLOSE message设置一个全局钩子:使用这个钩子,当任何应用程序通过标题栏上的CLOSE按钮关闭时,我都可以得到一个通知 缺点: (-)并非所有应用程序都生成WM_关闭消息(例如:Tota

我的应用程序需要监视系统上所有其他正在运行的应用程序。是否有某种方式可以在退出每个应用程序时通知我

我能找到的方法是:

1) 使用PSAPI函数以频繁的间隔获取正在运行的EXE的列表。在每次轮询时,与上一个列表进行比较,以确定哪个应用程序/进程已退出。 缺点:需要持续轮询,需要CPU时间

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

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

有没有其他更好的方法让我错过了?请告知

  • 使用PSAPI获取PID列表
  • 然后使用获取每个进程的句柄
  • 用于在其中一个进程退出时发出信号
  • 您可以尝试()API并筛选HSHELL\u WINDOWCREATED和HSHELL\u windowdestromed消息

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

    >还有其他更好的方法吗


    是的,很多。请参阅(系统通知,无任何挂钩)

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

    RegisterWaitForSingleObject(&waitHandle, processHandle, ProcessTerminatedCallback, param, INFINITE, WT_EXECUTEONLYONCE);
    
    其中: [out]waitHandle-为您创建的新句柄。请注意,您不能使用此句柄调用CloseHandle,但如果愿意,您可以等待它

    [in]processHandle-处理您应该获得的流程

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

    [in]param-LPVOID参数,该参数将传递给回调函数

    [in]无限-无限等待或等待指定时间,请查阅MSDN以了解更多信息


    [in]WM_executeOnOnce-将只调用回调函数一次。查看MSDN以了解更多信息

    除非万不得已,否则我将避免注册全局钩子。对于WaitForSingleObjects和WaitForMultipleObjects,我都会收到错误\u访问\u拒绝(0x5)。你知道为什么会发生这种情况,我做错了什么吗?我只能猜测:也许问得太多了?同步应该足够了。可能您的用户上下文不允许监视此进程(例如,简单用户无法访问系统进程。我相信即使是管理员用户也需要管理员提升才能访问这些进程)。问题实际上是权限问题,因此您是对的Serge-appTranslator。我使用了PROCESS\u ALL\u访问标志。这是否只会在输入句柄的进程结束时显式触发回调?或者还有其他事件会触发这个,因为“WaitForSingleObject”看起来很模糊?@Oblivionth,即使它崩溃了,它也会被调用。如果进程挂起,显然不会调用它。为此,您可能需要引入一些心跳机制,但为此,您必须能够访问流程的代码;然而,我最初的困惑是您如何确定这个函数首先向目标应用程序发出关闭信号。文档基本上只提到当“指定的对象处于信号状态”时,回调会触发,这听起来像是给定模糊度的任意数量的信号。我只是想确定这只在过程结束时才发出信号(不管是什么原因)。@Oblivionth,我可以保证它工作得很好。我曾在Windows服务中使用它来监视某些使用其API的应用程序。应用程序将在服务中存储大量数据,这是我实现的一个模块,它将清理应用程序使用的内存,以防它们在退出之前崩溃或忘记清理正在使用的内存。内存正在Windows服务空间中分配。我相信您在函数效果方面是正确的,但我想在官方文档中找到一个描述这些效果的语句,以防在使用过程中出现任何注释或警告。我最后在这里做了:->在Process下:“它的状态在进程运行时设置为nonsignaled,在进程终止时设置为signaled。”没有给出其他细节,所以它看起来很简单。