我需要使用Win32的最简单方法,通过其可执行文件名获取另一个进程的进程句柄。
我正在寻找的过程没有任何已注册的窗口类。我也知道如果它正在运行,那么它只会运行一个实例。
答案 0 :(得分:2)
使用CreateToolhelp32Snapshot,Process32First和Process32Next枚举所有流程。
在PROCESSENTRY32内,您可以找到szExeFile
成员。
您可以通过在同一结构中调用进程ID为th32ProcessID
的{{3}}来获取进程句柄。
找到与您的exe名称匹配的进程后,您可以跳出循环并获取句柄。
注意:如果您需要枚举每个进程,无论会话是什么,您都应该获得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 OpenProcess的示例。