如何正确获取Windows控件文本?现有代码返回父类名称该如何解决
问题原因
你定义的wchar_t* textOutput是未初始化的野指针,没有分配任何可写入的内存空间。GetWindowText执行时会直接向非法内存地址写入内容,最终读取到的是随机的内存数据,也就是你遇到的返回父类名称的异常情况。另外注意GetWindowTextLengthW返回的长度不包含字符串末尾的空终止符\0,分配内存时需要多预留1个字符的空间。
修复后的可运行代码
const wchar_t* textInput = L"Login"; HWND btnHandle = CreateWindowEx(0, L"BUTTON", textInput, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, mCoordinate.x, mCoordinate.y, mDimension.cx, mDimension.cy, parentHandle, NULL, (HINSTANCE)GetWindowLongPtr(parentHandle, GWLP_HINSTANCE), NULL); int length = GetWindowTextLengthW(btnHandle); if (length > 0) { // 额外预留1个字符空间存储空终止符 wchar_t* textOutput = (wchar_t*)malloc((length + 1) * sizeof(wchar_t)); if (textOutput != NULL) { GetWindowTextW(btnHandle, textOutput, length + 1); MessageBox(NULL, textOutput, L"Window Text", MB_OK); // 释放申请的堆内存,避免泄漏 free(textOutput); } }
简化方案
如果能确定控件文本的最大长度,也可以直接使用栈上的固定长度数组,无需手动管理内存:
wchar_t textOutput[256] = {0}; GetWindowTextW(btnHandle, textOutput, _countof(textOutput)); MessageBox(NULL, textOutput, L"Window Text", MB_OK);
内容的提问来源于stack exchange,提问作者david。
相关产品推荐
相关产品推荐

