我正在尝试创建一个程序,它将获得另一个程序的窗口名称。为此,我想使用带有WM_GETTEXT消息的SendMessage()函数。但我知道我可能做了很多错事,所以这里是我使用的代码:
string text;
SendMessage(windowHandle, WM_GETTEXT, sizeof(text), LPARAM(text));
我很确定......我可能有很多错误。 LPARAM(文本)可能是错误的,因为在MSDN中它说这个参数是:指向要接收文本的缓冲区的指针。
问题是......我不知道缓冲区是什么以及如何声明它...以及如何将其转换为带有窗口名称的字符串变量。
我得到的错误是:
error: invalid cast from type 'std::string {aka std::basic_string<char>}' to type 'LPA {aka long int}'
错误是针对SendMessage的行。所以我的问题是:
我做错了什么?什么是缓冲区?如何声明缓冲区?如何将该缓冲区转换为文本文件? 如果有人可以向我展示符合我想要的代码......这可能是我能要求的最佳答案!
答案 0 :(得分:1)
更改字符串文字;到TCHAR(TCHAR将导致unicode版本上的wchar_t)数组:
TCHAR text[256];
SendMessage(windowHandle, WM_GETTEXT, sizeof(text)/sizeof(text[0]), LPARAM(text));
如果您使用SendMessage与某个未知应用程序通信,则使用SendMessageTimeout会更安全,因为此应用程序实际上可以阻止给定消息:
DWORD result;
::SendMessageTimeout(hwnd, WM_GETTEXT, sizeof(text)/sizeof(text[0]), LPARAM(text), 0, 1000, &result);
答案 1 :(得分:1)
Win32 API是一个C api,你不能使用C ++字符串。您需要使用char
缓冲区:
char text[256];
LRESULT result = SendMessage(windowHandle, WM_GETTEXT, sizeof(text), LPARAM(text));
如果字符串的sizeof(text)
没有达到您想要的效果,那么text
也是sizeof
。 string
给出了使用的字节数,string
不是缓冲区中的字符数,因为string
动态分配缓冲区。
最后将LPARAM
投射到{{1}},这是一个整数没有任何意义。通常,无法将C ++对象转换为整数。
答案 2 :(得分:0)
SendMessage(WM_GETTEXT)需要为其LPARAM添加一组字符。
e.g。
const int nSize(80);
char szBuff[nSize] = "";
int nRet =
::SendMessage(hWnd, WM_GETTEXT, nSize, reinterpret_cast<LPARAM>(szBuff));