我有一個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. 如何查看gradle守護進程是否正在運行?
- 2. 如何檢查一個進程是否作爲Windows服務運行
- 3. 如何檢查一個進程是否使用Delphi運行?
- 4. 查看正在運行的進程的Windows激活上下文?
- 5. 如何檢查進程是否在Red Hat Linux上運行?
- 6. 檢查進程是否正在運行
- 7. 程序如何判斷另一個進程是否作爲服務運行?
- 8. 如何查看.NET程序是否正在運行
- 9. 如何檢查python腳本(test.py)是否在Windows 10上運行
- 10. 如何檢查我是否在Python的Windows上運行?
- 11. 我如何讓運行在一個進程上的actor將消息發送給在另一個進程上運行的另一個actor?
- 12. 如何檢查正在運行的進程是否是後臺進程?
- 13. 如何在另一個進程中運行一些Python代碼?
- 14. 如何驗證一個進程是否已經在powershell上運行?
- 15. 如何查看我的程序是否在Retina屏幕上運行
- 16. 如何在另一臺計算機上運行進程.net
- 17. 如何檢查Unix進程是否在Perl中運行?
- 18. 如何檢查Hadoop守護進程是否正在運行?
- 19. C++如何檢查Outlook進程是否已在運行
- 20. 如何檢查進程是否正在運行 - Linux
- 21. 如何使用VB腳本檢查進程是否在運行?
- 22. 如何檢查進程是否仍在c內核中運行?
- 23. 如何查找任意進程是否在wow64下運行?
- 24. 如何檢查Linux中是否正在運行進程?
- 25. 檢查Windows應用程序是否正在運行(而不是進程)
- 26. 如何結束在另一個倉庫中運行的另一個git進程?
- 27. 如何看tomcat是否正在運行
- 28. 檢查進程是否在Linux上運行的最佳實踐?
- 29. 檢查一個文件是否從另一個進程打開
- 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