SendMessage WM_GETTEXT错误

时间:2014-04-28 18:08:18

标签: c++ sendmessage

我正在尝试创建一个程序,它将获得另一个程序的窗口名称。为此,我想使用带有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的行。所以我的问题是:

我做错了什么?什么是缓冲区?如何声明缓冲区?如何将该缓冲区转换为文本文件? 如果有人可以向我展示符合我想要的代码......这可能是我能要求的最佳答案!

3 个答案:

答案 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也是sizeofstring给出了使用的字节数,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));