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
调用的结果将不可预测。
我想用 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
调用的结果将不可预测。