WM_GETTEXT仅返回单个字符

时间:2019-02-07 17:32:20

标签: c++ winapi

我是一名化学新手,正在编写脚本以帮助我自动处理一些数据。我现在正在使用的代码涉及使用WM_GETTEXT来获取窗口句柄的标题。但是,现在char缓冲区仅捕获单个字符,而不是整个标题。似乎几年前有人遇到类似的问题(链接:http://www.cplusplus.com/forum/beginner/58207/),这表明该问题可能与混合数据类型有关。我尝试按照建议的方式切换到TCHAR,但这样做却无法编译(收到无法从“ const char [1]转换为TCHAR [254]的错误)。这是我正在使用的代码:

int textLen = (int)SendMessage(windowHandle, WM_GETTEXTLENGTH, 0, 0);
std::cout << "The handle length is: " << textLen << std::endl;
const int bufferSize = 254;
char textBuffer[bufferSize] = "";
SendMessage(windowHandle, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
std::cout << "The handle title is: " << textBuffer << std::endl;

有人有什么建议吗?我正在Microsoft Visual Studio中工作,我认为这可能是问题的一部分,但是我不确定如何解决它。

2 个答案:

答案 0 :(得分:0)

尝试调用SendMessageA而不是SendMessage-表示您使用的是char而不是WCHAR(即TCHAR可能真正使用过的字符)。

或者,使用std::cout的宽字符版本,即std::wcout,并始终使用TCHAR / WCHAR(包括textBuffer声明)。

实质上,您是在将宽弦与老式弦混合在一起。

答案 1 :(得分:0)

另一个答案是正确的,但是您可能要考虑使用GetWindowText而不是发送消息。

使用GetWindowText,无论您使用-A或-W后缀,都将获得某种类型的安全性,这可能首先帮助您避免了此问题。

在某些情况下,即使拥有目标窗口的进程挂起或未及时响应消息,GetWindowText仍可以返回标题。