2012-11-01 118 views
3

在沒有獲取所有進程的情況下,是否有psapi或windows.h中的任何函數來獲取期望進程「僅通過進程名稱(例如:」chrome.exe「)運行。檢查某個特定進程是否在運行C++的windows上運行

編輯:

如果任何一個需要通過全部進程列表中運行,我可以在這裏貼上我的代碼以獲得所需的處理信息。它在xp機器上工作,並與vs 2008編譯。

我也發現了我的問題的解決方案!但是根據msdn,該函數已經在進程中運行並檢查沒有擴展名的名稱。不久它會搜索「chrome」並返回chrome列表。*

此函數有一個很好的優點,它返回列表中的進程,它可能是一個exe可能運行may實例。缺點CLR是必需的,它的運行速度比PSAPI功能更慢,它有額外的皈依要求如String ^到WCHAR或字符串(我沒有測試)

回答

4

上面的回答工程對勝利8.這是沒有wstring的東西,並剝離的路徑

#include <tlhelp32.h> 
DWORD FindProcessId(char* processName) 
{ 
    // strip path 

    char* p = strrchr(processName, '\\'); 
    if(p) 
     processName = p+1; 

    PROCESSENTRY32 processInfo; 
    processInfo.dwSize = sizeof(processInfo); 

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
    if (processesSnapshot == INVALID_HANDLE_VALUE) 
     return 0; 

    Process32First(processesSnapshot, &processInfo); 
    if (!strcmp(processName, processInfo.szExeFile)) 
    { 
     CloseHandle(processesSnapshot); 
     return processInfo.th32ProcessID; 
    } 

    while (Process32Next(processesSnapshot, &processInfo)) 
    { 
     if (!strcmp(processName, processInfo.szExeFile)) 
     { 
      CloseHandle(processesSnapshot); 
      return processInfo.th32ProcessID; 
     } 
    } 

    CloseHandle(processesSnapshot); 
    return 0; 
} 
1
#include "stdafx.h" 
#include <windows.h> 
#include <tlhelp32.h> 
#include <iostream> 

using namespace std; 

DWORD FindProcessId(const std::wstring& processName); 

int main(int argc, char* argv[]) 
{ 

    bool bAnyBrowserIsOpen = false; 

    if (FindProcessId(L"chrome.exe") || FindProcessId(L"firefox.exe") || FindProcessId(L"iexplore.exe")) 
    { 
    bAnyBrowserIsOpen = true; 
    } 

    return 0; 
} 


DWORD FindProcessId(const std::wstring& processName) 
{ 
    PROCESSENTRY32 processInfo; 
    processInfo.dwSize = sizeof(processInfo); 

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
    if (processesSnapshot == INVALID_HANDLE_VALUE) 
    return 0; 

    Process32First(processesSnapshot, &processInfo); 
    if (!processName.compare(processInfo.szExeFile)) 
    { 
    CloseHandle(processesSnapshot); 
    return processInfo.th32ProcessID; 
    } 

    while (Process32Next(processesSnapshot, &processInfo)) 
    { 
    if (!processName.compare(processInfo.szExeFile)) 
    { 
     CloseHandle(processesSnapshot); 
     return processInfo.th32ProcessID; 
    } 
    } 

    CloseHandle(processesSnapshot); 
    return 0; 
} 
1

您可以使用CreateToolhelp32Snapshot如上所述。如果您需要定期輪詢流程,請在找到流程後保存流程ID,然後使用OpenProcess進行檢查。這要快很多倍,但要注意操作系統會回收PID,所以你必須處理這個問題。

如果你瞭解過程的內部(甚至擁有控制權),還有其他的選擇,如檢查:

  • 命名內存對象的存在(使用的CreateFileMapping)
  • 一個名爲互斥體的存在(使用OpenMutex)

更多細節在回答這個問題給出:Fast way to check for a specific process running

相關問題