2010-02-17 111 views
1

我需要從使用Win32的C最簡單的方式通過其可執行文件名來獲取另一個進程的進程句柄。通過圖像名稱獲取進程的進程句柄

我正在查找的過程沒有任何已註冊的窗口類。我也知道如果它正在運行,它將只有一個它正在運行的實例。

+2

你可以看看http://stackoverflow.com/questions/865152/how-can-i-get-a-process-handle-by-its-name-in-c –

回答

2

使用CreateToolhelp32Snapshot,Process32FirstProcess32Next來枚舉所有的過程。

PROCESSENTRY32裏面你可以找到一個szExeFile的成員。 您可以通過在同一結構中調用OpenProcess和進程ID th32ProcessID來獲得進程句柄。

一旦找到一個與您的exe名稱匹配的進程,您可以跳出循環並獲取句柄。

注意:如果您需要枚舉EVERY進程而不管會話是什麼,您應該獲得SE_DEBUG特權。

在你的主電話本的頂部:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege 

這裏是acquirePrivilegeByName定義:

BOOL acquirePrivilegeByName(
          const TCHAR  *szPrivilegeName) 
{ 
    HANDLE   htoken; 
    TOKEN_PRIVILEGES tkp; 
    DWORD   dwerr; 

    if (szPrivilegeName == NULL) 
    { 
     SetLastError(ERROR_INVALID_PARAMETER); 
     return FALSE; 
    } 

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid))) 
     return FALSE; 

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken)) 
     return FALSE; 

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) || 
     GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED 
    { 
     dwerr = GetLastError(); 
     CloseHandle(htoken); 
     SetLastError(dwerr); 
     return FALSE; 
    } 

    CloseHandle(htoken); 
    SetLastError(ERROR_SUCCESS); 

    return TRUE; 
} //acquirePrivilegeByName() 

除了我上面說的,有如何的例子使用上面的Win32 API here