首页 文章

检测进程是否仍在运行

提问于
浏览
4

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

  • 6

    您可以使用测试过程寿命

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

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

    返回值如果函数成功,则返回值为非零值 . 如果函数失败,则返回值为零 . 要获取扩展错误信息,请调用GetLastError .

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

相关问题