我有一个程序(作为后台进程运行),我在其中安装了一个钩子来捕获 EVENT_SYSTEM_FOREGROUND 事件(即 - 当用户在窗口之间切换时)。为钩子注册的回调基本上记录了用户从哪个应用程序(进程 exe 文件名)切换以及他们切换到了哪个应用程序。
我想添加一些代码来检查他们切换的应用程序是否仍然处于活动状态(如果不是,我们假设他们已经关闭它,这就是将新窗口带入前台的原因)。我正在通过尝试使用OpenProcess创建上一个 PID 的句柄来测试它的存在
//Check prev pid still exists - if not, assume the previous app has been closed
HANDLE hPrevProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,g_prevPid);
if (hPrevProc==NULL){
prevProcStillRunning=false;
}
else{
CloseHandle(hPrevProc);
}
上面代码的假设:
g_prevPid 填充了一个 PID - 我已经验证了这个
prevProcStillRunning 已经初始化为 true
上面代码的问题在于,出于某种原因,即使用户退出了应用程序(例如 notepad.exe)。在它们退出后长达 10 秒内,此测试仍然通过(即 - hPrevProc 被初始化)。尽管我可以在任务管理器中看到 Notepad.exe 进程已经消失(是的,我只打开了它的一个实例),但不知何故,OpenProcess 行仍然可以获取该 PID 的句柄。我猜想PID实际上仍然存在,但它可能处于终止状态。我发现如果这段代码被多次调用,最终它会返回 null。
我想找到一种更好的方法来测试 hPrevProc 是否仍然处于活动状态。我尝试使用GetExitCodeProcess函数对此进行测试,但这似乎只是给了我 PID,我什至不确定这是否是正确的方法。
任何帮助表示赞赏。