我有一個VC++控制檯應用程序,我需要檢查是否有另一個進程正在運行。我沒有窗口標題,我擁有的只是可執行文件的名稱。我如何獲得流程句柄/ PID?我可以列舉使用這個.exe運行的進程嗎?如何查看另一個進程是否在Windows上運行?
4
A
回答
2
您可以使用EnumProcesses來枚舉系統上的進程。
您需要使用OpenProcess獲取進程句柄,然後使用QueryFullProcessImageName來獲取進程可執行文件。
4
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
相關問題
- 1. 如何檢查進程是否在Windows上運行?
- 2. Java - 如何檢查另一個(非Java)進程是否在Linux上運行
- 3. 查看進程是否在Windows中運行psutil
- 4. 如何查看gradle守護進程是否正在運行?
- 5. 檢查某個特定進程是否在運行C++的windows上運行
- 6. 如何檢查一個進程是否作爲Windows服務運行
- 7. 如何檢查一個進程是否使用Delphi運行?
- 8. 如何檢查進程是否在Red Hat Linux上運行?
- 9. 查看正在運行的進程的Windows激活上下文?
- 10. 檢查一些exe程序是否在windows上運行
- 11. 如何檢查是否一些進程正在運行
- 12. 如何檢查另一個記錄器是否正在運行?
- 13. 如何可靠地檢查一個Windows進程是否是C++中的另一個父進程?
- 14. 如何檢查某個進程是否正在運行或不
- 15. 測試以查看Gearman守護進程是否正在運行
- 16. 如何知道一個進程是否在C++,WinAPI的Windows中運行?
- 17. 如何檢查Windows可執行文件是否在Session 0進程中運行?
- 18. 檢查進程是否正在運行
- 19. 檢查進程是否正在運行
- 20. 程序如何判斷另一個進程是否作爲服務運行?
- 21. 如何檢查進程是否與另一進程通信?
- 22. MYSQL:如何查看是否在另一個表中存在varchar
- 23. 檢查一個進程是否在Unix中運行
- 24. 如何查看.NET程序是否正在運行
- 25. 如何檢查我是否在Python的Windows上運行?
- 26. 如何檢查批處理文件是否在Windows上運行?
- 27. 如何檢查python腳本(test.py)是否在Windows 10上運行
- 28. 如何檢查一個線程是否在C#中運行?
- 29. 在一臺機器上運行的進程如何知道另一個進程是否在使用c/C++的linux中的不同機器上運行?
- 30. 在Windows中的另一個用戶下運行進程
這個問題是針對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