我如何看到另一个进程在Windows上运行?

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

Solutions Collecting From Web of "我如何看到另一个进程在Windows上运行?"

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

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

使用CreateToolhelp32Snapshot函数

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成员可能已经足够满足你的需求了。