我怎样才能得到一个进程句柄的C ++名称?

我想要得到example.exe的进程句柄,所以我可以在它上面调用TerminateProcess 。 我该怎么做? 注意,它没有窗口,所以FindWindow将不起作用。

 #include <cstdio> #include <windows.h> #include <tlhelp32.h> int main( int, char *[] ) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; } 

另外,如果你想在OpenProcess中使用PROCESS_ALL_ACCESS,你可以试试这个:

 #include <cstdio> #include <windows.h> #include <tlhelp32.h> void EnableDebugPriv() { HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL); CloseHandle(hToken); } int main( int, char *[] ) { EnableDebugPriv(); PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; } 

以下代码显示了如何使用toolhelp和OpenProcess来获取进程的句柄。 出于简洁目的删除了error handling。

 HANDLE GetProcessByName(PCSTR name) { DWORD pid = 0; // Create toolhelp snapshot. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process; ZeroMemory(&process, sizeof(process)); process.dwSize = sizeof(process); // Walkthrough all processes. if (Process32First(snapshot, &process)) { do { // Compare process.szExeFile based on format of name, ie, trim file path // trim .exe if necessary, etc. if (string(process.szExeFile) == string(name)) { pid = process.th32ProcessID; break; } } while (Process32Next(snapshot, &process)); } CloseHandle(snapshot); if (pid != 0) { return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); } // Not found return NULL; } 

有两个基本的技术。 第一个使用PSAPI; MSDN有一个使用EnumProcessesOpenProcessEnumProcessModulesGetModuleBaseName 的示例 。

另一个使用Toolhelp,我更喜欢。 使用CreateToolhelp32Snapshot获取进程列表的快照,用Process32FirstProcess32Next (它提供模块名称和进程ID)遍历它,直到find所需的,然后调用OpenProcess来获取句柄。

查看: MSDN文章

你可以使用GetModuleName (我认为?)来获取名称并检查。

OpenProcess函数

来自MSDN:

要打开另一个本地进程的句柄并获得完全访问权限,您必须启用SeDebugPrivilege权限。