WM_GETTEXT 用法

问题描述 投票:0回答:3

我正在尝试获取应用程序中文本字段的状态。但我无法让它发挥作用。我使用

SendMessage
来获取
WM_GETTEXT
,我将内容保存到
char *

我将 char * 输出到文件中,但只得到“D”。这就是我现在拥有的:

LRESULT result;
char * output = (char*)malloc(1024);

result = SendMessage(hwnd,WM_GETTEXT,1024,(LPARAM)output);

ofstream file("test.txt");
file <<  *output;
file.close();

delete [] output;
windows visual-c++ visual-studio-2005 sendmessage
3个回答
5
投票

指针概念

文件<< *output; will print the first element of the string array

文件<< output; print the entire string


0
投票

C#代码:

public const uint WM_GETTEXT = 0xD;
const int bufferSize = 10000;
StringBuilder sb = new StringBuilder(bufferSize);
SendMessageGetText(handle, WM_GETTEXT, new UIntPtr(bufferSize), sb);

Console.WriteLine(sb.ToString());

对我来说工作正常!


0
投票

索菲亚的回答是正确的。但是,现在 Visual Studio 项目的默认设置是创建 Unicode 项目。如果您的项目是 Unicode 而不是 MBCS,您只会收到第一个字母。

您是否检查过从

WM_GETTEXT
返回的缓冲区以验证它是否包含整个字符串?

如果没有,请尝试将输出变量声明为

TCHAR*
(通用)或
wchar_t*
并查看在缓冲区中得到什么结果。

附注用

malloc
分配内存并用
delete
释放内存是不好的形式。您应该使用
malloc
/
free
对或
new
/
delete
对。分配
char
缓冲区的更安全方法是使用
std::string
或对宽字符串使用
std::wstring

P.P.S。尝试确保您的项目设置适用于多字节项目而不是 Unicode 项目。那么索菲亚答案中的一切都会起作用。

还有一件事...只需使用

GetWindowText()
API 而不是
SendMessage
的东西。这就是它存在的原因,这样您就不必经历将指针强制转换为
LPARAM
WPARAM
的繁琐操作。它更加类型安全,如果您的类型不匹配,它会给您一个编译时错误(比运行时错误更好)——特别是对于 Unicode/MBCS 和
wchar_t
/
char

© www.soinside.com 2019 - 2024. All rights reserved.