我正在尝试获取应用程序中文本字段的状态。但我无法让它发挥作用。我使用
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;
指针概念
文件<< *output; will print the first element of the string array
文件<< output; print the entire string
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());
对我来说工作正常!
索菲亚的回答是正确的。但是,现在 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
。