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
相关产品推荐
相关产品推荐

