Windows下检测用户聚焦窗口(正在使用的窗口)Windows API GetForegroundWindow 函数详解 Windows APIGetForegroundWindow函数详解一、函数简介GetForegroundWindow是 Windows API 中一个非常实用的函数用于获取当前用户正在操作的前台窗口句柄。所谓前台窗口就是当前获得焦点的窗口——你正在打字、点击的那个窗口。这个函数在 Win32 编程中用得挺多比如你想知道用户现在在操作哪个程序、做窗口管理器、或者给前台窗口发消息都可能用到它。系统会为创建前台窗口的线程分配略高于其他线程的优先级以保证前台窗口的响应流畅性。这个设计挺合理——你正在用的程序当然应该更流畅。二、函数原型HWNDGetForegroundWindow();头文件winuser.h通常包含windows.h即可库文件User32.libDLLUser32.dll最低支持版本Windows 2000 Professional 及以上仅限桌面应用三、参数无参数。直接调用就行。四、返回值成功返回前台窗口的句柄HWND类型特殊情况可能返回NULL。比如窗口正在失去激活状态的时候或者没有前台窗口的情况下注意返回的句柄可能随时失效比如用户切走了窗口或者窗口被关闭了所以使用时最好配合IsWindow验证一下。五、与GetActiveWindow的区别很多初学者会把这两个搞混这里说清楚函数作用范围说明GetForegroundWindow全局获取整个系统中用户当前正在操作的前台窗口GetActiveWindow当前线程获取当前调用线程中的活动窗口简单说GetForegroundWindow看的是整个系统GetActiveWindow只看你自己线程里的窗口。举个例子如果你的程序在后台跑用户正在用 Chrome 浏览器。这时候调用GetForegroundWindow返回的是 Chrome 的窗口句柄而GetActiveWindow返回的是NULL因为你的线程没有活动窗口。实际开发中GetForegroundWindow用得更多一些。六、使用注意事项返回值可能为 NULL调用后最好判断一下避免后续操作野指针句柄可能失效获取句柄后到使用句柄之间窗口可能已经被销毁。建议用IsWindow做有效性检查权限问题某些情况下如果你的程序没有足够的权限可能无法对前台窗口进行操作比如发送消息不要过度依赖前台窗口是用户控制的随时可能变化不适合做关键业务逻辑的强依赖完整示例#includewindows.h#includeiostreamintmain(){// 1. 获取当前前台窗口句柄HWND hWndGetForegroundWindow();// 2. 判断是否获取成功if(hWndNULL){std::cout当前没有前台窗口std::endl;return0;}// 3. 获取窗口标题chartitle[256]{0};GetWindowTextA(hWnd,title,sizeof(title));// 4. 打印结果std::cout前台窗口句柄: 0xstd::hexhWndstd::decstd::endl;std::cout窗口标题: (title[0]!\0?title:(无标题))std::endl;return0;}运行说明直接编译运行程序会瞬间打印出你当前正在操作的窗口句柄和标题然后退出。如果你想看不同窗口的效果把焦点切到别的窗口再重新运行程序就行。如果你想做一个“实时刷新”的版本按回车持续查看把main函数改成下面这样就行其他代码不变intmain(){while(true){system(cls);// 清屏HWND hWndGetForegroundWindow();if(hWnd){chartitle[256]{0};GetWindowTextA(hWnd,title,sizeof(title));std::cout句柄: 0xstd::hexhWndstd::dec\n标题: titlestd::endl;}else{std::cout无前台窗口std::endl;}Sleep(1000);// 每秒刷新一次}return0;}参考文档Microsoft Docs - GetForegroundWindow functionMicrosoft Docs - GetForegroundWindow 函数 (winuser.h)