You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取用户当前激活窗口的句柄?窗口监控代码异常排查

问题原因

你代码里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:28:24