【发布时间】:2015-12-19 13:06:04
【问题描述】:
我有一个程序(作为后台进程运行),我在其中安装了一个挂钩来捕获 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,我什至不确定这是否是正确的方法。
任何帮助表示赞赏。
【问题讨论】:
-
内核对象的最后一个句柄关闭并因此导致 OpenProcess() 失败的确切时间是完全不可预测的。程序员自愿在他们的机器上安装的典型的收缩包装恶意软件很可能使其存活的时间比预期的要长。
-
僵尸进程有一个 ID,即使它们已经终止。使用
WaitForSingleObject,超时时间为0,查看进程是否已终止。
标签: c++ pid openprocess