如何获得程序状态(停止工作)

时间:2015-09-25 10:02:25

标签: c++ winapi

我正在使用VS C ++ 2010.我需要获得程序状态但似乎当程序说它停止工作时我的功能无效。如果它停止工作,我需要重新启动程序。

我的代码:

BOOL IsProcessRunning(DWORD pid)
{
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
    DWORD ret = WaitForSingleObject(process, 0);
    CloseHandle(process);
    return ret == WAIT_TIMEOUT;
}

1 个答案:

答案 0 :(得分:3)

此代码永远不会有效。如果外部进程已停止运行,则OpenProcess将失败,因为进程已结束且PID不再有效。并且您不检查OpenProcess返回的值。或者PID已被重复使用,然后你就可以处理错误的过程。

要以可靠的方式使用WaitForSingleObject,您需要获得流程的句柄并继续使用它。请拨打OpenProcess一次,然后将该句柄用于对WaitForSingleObject的所有后续调用。只有在完成该过程的处理后才能调用CloseHandle

但是,使用WaitForSingleObject对于检测程序没有响应是没有用的。在这种情况下,对OpenProcess的调用将成功,因为该过程仍然存在并且正在运行。由于进程仍在运行,对WaitForSingleObject的调用将返回WAIT_TIMEOUT。毕竟,挂起的进程仍在运行。

因此,代码的整个前提是错误的。挂窗(或实际上任何窗口)只能存在于正在运行的进程中!您需要丢弃所拥有的代码,而只需调用IsHungAppWindow。您将需要应用程序主窗口的窗口句柄。