1
我需要從使用Win32的C最簡單的方式通過其可執行文件名來獲取另一個進程的進程句柄。通過圖像名稱獲取進程的進程句柄
我正在查找的過程沒有任何已註冊的窗口類。我也知道如果它正在運行,它將只有一個它正在運行的實例。
我需要從使用Win32的C最簡單的方式通過其可執行文件名來獲取另一個進程的進程句柄。通過圖像名稱獲取進程的進程句柄
我正在查找的過程沒有任何已註冊的窗口類。我也知道如果它正在運行,它將只有一個它正在運行的實例。
使用CreateToolhelp32Snapshot,Process32First和Process32Next來枚舉所有的過程。
在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。
你可以看看http://stackoverflow.com/questions/865152/how-can-i-get-a-process-handle-by-its-name-in-c –