如何查看另一个进程是否在Windows上运行?
问题描述:
我有一个VC++控制台应用程序,我需要检查是否有另一个进程正在运行。我没有窗口标题,我拥有的只是可执行文件的名称。我如何获得流程句柄/ PID?我可以列举使用这个.exe运行的进程吗?如何查看另一个进程是否在Windows上运行?
答
hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
其次Process32First和Process32Next。
你会得到一个PROCESSENTRY32结构如下szExeFile成员。
PROCESSENTRY32W processInfo;
processInfo.szExeFile
确保枚举之前先获取特权SeDebugPrivilege
,这样你会得到所有会话和用户的所有进程。
为了获得特权,所以你得到的所有会话:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
凡acquirePrivilegeByName被定义为:
BOOL acquirePrivilegeByName(
const TCHAR *szPrivilegeName)
{
HANDLE htoken;
TOKEN_PRIVILEGES tkp;
DWORD dwerr;
//---------------- adjust process token privileges to grant privilege
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()
如果您需要完整的过程图像名称可以使用QueryFullProcessImageName,但szExeFile会员可能已经足够满足您的需求。
+0
完美。使用源代码。谢谢! – 2009-07-29 23:16:24
这个问题是针对VB的,但是API调用也应该适用于C++:http://stackoverflow.com/questions/1143301/how-to-enumerate-processes-from-vb-6-on-win- 2003 – bdonlan 2009-07-29 18:06:14