检测进程是否仍在运行

时间:2009-08-06 11:45:54

标签: c++ windows process

我需要检查具有给定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
}

4 个答案:

答案 0 :(得分:6)

您可以使用

测试过程寿命
bool isProcessRunning(HANDLE process)
{
   return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT;
}

答案 1 :(得分:2)

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

  

返回值

     

如果功能成功,则返回   价值非零。

     

如果功能   失败,返回值为零。至   获取扩展错误信息,调用    GetLastError函数

答案 2 :(得分:1)

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

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;
}

答案 3 :(得分:0)

您可以使用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;  
}