C ++进程监控(GetExitCodeProcess)

时间:2016-08-09 22:19:19

标签: c++ windows process

我想用c ++监控进程,所以我正在使用:

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

FindWindow函数,据我所知,检查所有窗口的标题(为什么微软将其操作系统的核心部分命名为OS,检查Windows中的窗口,疯狂)。如果标题与“针”匹配,那么它会给我......

HWND windowHandle

接下来我正在使用:

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

这为我提供了我命名的processID或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”(新动词)状态的值给了我某种十六进制代码。尽管有多个窗口以“针”作为标题,但它永远不会是“STILL_ACTIVE”。代码编译很好,它只是与转换,指针,LPCWSTR或我从未遇到过的东西有关。帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:1)

一个错误(可能不是唯一的错误)是没有办法可以正常工作:

DWORD* PID;
GetWindowThreadProcessId(windowHandle, PID);

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

当函数请求指针时,它并不意味着您逐字地声明指针并将其传递给函数。该函数需要现有实体的地址

DWORD PID;
GetWindowThreadProcessId(windowHandle, &PID);

答案 1 :(得分:1)

你有两个问题:

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);

请注意,这仍然只适用于一个进程。如果多个进程的窗口标题为&#34; needle&#34;那么FindWindow来电的结果将无法预测。