簡體   English   中英

如何查看Windows上是否還有其他進程正在運行?

[英]How do I see if another process is running on windows?

我有一個VC ++控制台應用程序,我需要檢查是否正在運行另一個進程。 我沒有窗口標題,我只有可執行文件名稱。 如何獲取進程句柄/ PID? 我可以枚舉使用此.exe運行的進程嗎?

使用CreateToolhelp32Snapshot功能

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

隨后是Process32FirstProcess32Next

您將使用szExeFile成員獲得如下的PROCESSENTRY32結構。

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成員可能足以滿足您的需要。

您可以使用EnumProcesses枚舉系統上的進程。

您需要使用OpenProcess來獲取進程句柄,然后使用QueryFullProcessImageName來獲取進程可執行文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM