如何查看另一个进程是否在Windows上运行?

问题描述:

我有一个VC++控制台应用程序,我需要检查是否有另一个进程正在运行。我没有窗口标题,我拥有的只是可执行文件的名称。我如何获得流程句柄/ PID?我可以列举使用这个.exe运行的进程吗?如何查看另一个进程是否在Windows上运行?

+0

这个问题是针对VB的,但是API调用也应该适用于C++:http://*.com/questions/1143301/how-to-enumerate-processes-from-vb-6-on-win- 2003 – bdonlan 2009-07-29 18:06:14

您可以使用EnumProcesses来枚举系统上的进程。

您需要使用OpenProcess获取进程句柄,然后使用QueryFullProcessImageName来获取进程可执行文件。

使用CreateToolhelp32Snapshot功能

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

其次Process32FirstProcess32Next

你会得到一个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