C++ 进程监控 (GetExitCodeProcess)

C++ Process Monitoring (GetExitCodeProcess)

我想用 C++ 监控进程,所以我使用:

std::wstring windowName = TEXT("needle");
HWND windowHandle = FindWindowW(NULL, windowName.c_str());

FindWindow 函数,据我所知,检查所有 windows 的标题(为什么微软在它的核心部分之后命名他们的 OS,检查 windows 在 Windows, 疯狂)。如果标题匹配 "needle" 那么它会给我...

HWND windowHandle

接下来我使用:

DWORD* PID;
GetWindowThreadProcessId(windowHandle, PID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, *PID);

这为我提供了我命名的进程 ID 或 PID。然后我可以用它来...

HWND p;
DWORD state;
GetExitCodeProcess(p, &state);

...获取进程状态,我将检查它是否为 "STILL_ACTIVE",如下所示:

        if (state != STILL_ACTIVE) {
        std::cout << "excessive profanity\n";
    }
    else {
        std::cout << "sigh of relief\n";
    }

除非这不起作用,"cout-ing"(新动词)state 的值给了我某种十六进制代码。尽管有多个以 "needle" 为标题的 windows,但它永远不会 "STILL_ACTIVE"。代码编译得很好,它只是与转换、指针、LPCWSTR 或我从未遇到过的东西有关。帮助将不胜感激。谢谢

一个错误(可能不是唯一的错误)是无法正常工作:

DWORD* PID;
GetWindowThreadProcessId(windowHandle, PID);

您给 GetWindowThreadProcessId 一个未初始化的指针,PID。除了取消引用它(导致未定义的行为),或者充其量检查该值是否为 NULL 之外,该函数无法对其执行任何操作。

当一个函数请求一个指针时,这并不意味着你真的声明了一个指针并将它传递给函数。该函数需要现有实体的地址

DWORD PID;
GetWindowThreadProcessId(windowHandle, &PID);

你有两个问题:

1) 正如 PaulMcKenzie 在他的回答中指出的那样,PID 没有指向任何内容,并且会导致问题。相反,您应该声明一个 DWORD 并将指向它的指针传递给 GetWindowThreadProcessId:

DWORD PID;
// note: &PID instead of just PID
GetWindowThreadProcessId(windowHandle, &PID);
// note: Just PID instead of *PID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

2) GetExitCodeProcess 需要进程句柄,而不是未初始化的 HWND。相反,您应该给它从 OpenProcess:

返回的句柄
DWORD state;
// note: this is the hProcess returned from OpenProcess
GetExitCodeProcess(hProcess, &state);

请注意,这仍然只适用于一个进程。如果多个进程 windows 的标题为 "needle" 那么您的 FindWindow 调用的结果将不可预测。