检测一个进程是否仍在运行

我需要检查一个给定的HANDLE进程是否仍在运行,我尝试使用下面的代码来完成它,但是它总是返回第二个返回false,即使进程正在运行。

bool isProcessRunning(HANDLE process) { if(process == INVALID_HANDLE_VALUE)return false; DWORD exitCode; if(GetExitCodeProcess(process, &exitCode) != 0) return false;//always returns here return GetLastError() == STILL_ACTIVE;//still running } 

Solutions Collecting From Web of "检测一个进程是否仍在运行"

你可以通过使用测试过程的生活

 bool isProcessRunning(HANDLE process) { return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT; } 

http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx

返回值

如果函数成功,则返回值为非零。

如果函数失败,返回值为零。 要获得扩展错误信息,请调用GetLastError

我知道这有点晚,但是如果你想得到你想要的结果,你的代码应该是这样读的。

 bool isProcessRunning(HANDLE process) { DWORD exitCodeOut; // GetExitCodeProcess returns zero on failure if( GetExitCodeProcess( process, &exitCodeOut ) == 0 ) { // Optionally get the error // DWORD error = GetLastError(); return false; } // Return if the process is still active return exitCodeOut == STILL_ACTIVE; } 

如果你只有进程ID(PID),这个片段将工作(没有错误检查):

 bool isProcessRunning(DWORD processID) { if( HANDLE process = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID ) ) { DWORD exitCodeOut; // GetExitCodeProcess returns zero on failure if( GetExitCodeProcess( process, &exitCodeOut ) != 0 ) { // Return if the process is still active return exitCodeOut == STILL_ACTIVE; } } return false; } 

您可以使用EnumProcesses()来获取在Windows上运行的所有进程。 就像是:

 bool IsProcessRunning(int pid) { unsigned long processes[2048]; unsigned long num_proc = 0; unsigned long needed = 0; // assume that 2048 processes are enought if (EnumProcesses(processes, sizeof(processes), &needed)) num_proc = needed / sizeof(DWORD); for (int i = 0; i < num_proc; i++) if (processes[i] == pid) return true; return false; }