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

C++ wcout输出GetWindowTextW获取的WCHAR数组时卡住无后续输出

异常原因

wcout默认使用C标准locale,未适配Windows控制台的宽字符输出逻辑。当执行wcout<<str时,如果获取到的窗口标题包含宽字符,当前locale无法完成字符转换,会给wcout流设置failbit错误标记。流进入错误状态后,后续所有输出操作都会被直接跳过、不会执行任何写入,因此你只会看到第一次输出的"11",后续的str和"22"都无法显示,但程序本身的循环逻辑、变量取值都不受影响,这和单步调试观察到的现象完全一致。
换成cout搭配GetWindowTextA时走窄字符输出逻辑,英文字符在默认配置下可以正常输出,不会触发流错误,因此循环看起来运行正常。

解决方法

在首次调用wcout输出前,给wcout设置适配当前系统的locale即可解决问题,推荐在main函数初始化阶段添加如下配置:

#include <locale>
// 配置wcout使用当前系统的用户默认locale
wcout.imbue(locale(""));

如果需要输出UTF-8内容,也可以搭配Windows API设置控制台输出代码页:

#include <windows.h>
// 设置控制台输出为UTF-8编码
SetConsoleOutputCP(CP_UTF8);

注意如果流已经触发过fail状态,需要先清除错误标记才能恢复输出:

wcout.clear();

修正后的可正常运行的完整代码示例:

#include <windows.h>
#include <iostream>
#include <locale>

using namespace std;

int main()
{
    // 初始化宽字符输出配置
    wcout.imbue(locale(""));
    while(TRUE){
        HWND window = GetForegroundWindow();
        WCHAR str[300] = {0};
        GetWindowTextW(window, str, 299);
        wcout << L"11" << endl;
        wcout << str << endl;
        wcout << L"22" << endl;
        Sleep(1000);
    }
    return 0;
}

补充注意:同一个控制台程序中尽量不要混用cout和wcout输出,否则可能出现流缓冲区混乱、输出顺序异常的问题。

内容的提问来源于stack exchange,提问作者user19021341

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:06:29