我想用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或我从未遇到过的东西有关。帮助将不胜感激。感谢
答案 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
来电的结果将无法预测。