如何获取用户当前激活窗口的句柄?窗口监控代码异常排查
问题原因
你代码里的activeWindow只在循环开始前获取了一次,之后不管前台窗口怎么切换,这个变量都不会更新,所以一直输出最初的终端窗口名称。
修正后的代码
#include <windows.h> #include <iostream> int main() { while (true) { HWND activeWindow = GetForegroundWindow(); // 每次循环重新获取当前前台窗口 if (activeWindow) { char windowText[256]; GetWindowTextA(activeWindow, windowText, sizeof(windowText)); std::cout << "当前前台窗口: " << windowText << "\n"; } else { std::cerr << "未找到前台窗口" << std::endl; break; } Sleep(500); // 休眠500毫秒,避免循环占用过高CPU } std::cin.ignore(); return 0; }
关键修改说明
- 将
GetForegroundWindow()移到while循环内部,确保每次循环都能获取当前最新的前台窗口 - 添加
Sleep(500)控制检测频率,既保证能及时捕捉窗口切换,又不会让程序占用过多CPU资源
如果需要更准确的应用程序名称(比如窗口标题可能包含额外内容,而你需要进程名),可以通过以下代码实现:
#include <windows.h> #include <iostream> #include <psapi.h> #include <cstring> #pragma comment(lib, "psapi.lib") int main() { while (true) { HWND activeWindow = GetForegroundWindow(); if (activeWindow) { DWORD processId; GetWindowThreadProcessId(activeWindow, &processId); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (hProcess) { char processPath[MAX_PATH]; GetModuleFileNameExA(hProcess, NULL, processPath, sizeof(processPath)); // 提取文件名部分 char* processName = strrchr(processPath, '\\'); if (processName) { std::cout << "当前前台程序名称: " << processName + 1 << "\n"; } else { std::cout << "当前前台程序路径: " << processPath << "\n"; } CloseHandle(hProcess); } } else { std::cerr << "未找到前台窗口" << std::endl; break; } Sleep(1000); } std::cin.ignore(); return 0; }
这个版本能直接获取应用程序的可执行文件名,比窗口标题更准确——比如Chrome浏览器的窗口标题是网页名,但进程名是chrome.exe。
内容的提问来源于stack exchange,提问作者I.Kram
相关产品推荐
相关产品推荐

