我正在尝试使用win32 api中的SendMessage在记事本窗口的文本框中获取文本。我首先找到窗口句柄,然后使用SendMessage(hwndEdit,WM_GETTEXT,(WPARAM)bufferSize,(LPARAM)textBuffer)获取文本。由于某种原因,即使它可以告诉我正确的文本长度,程序只返回记事本文本的1个字符,即使我有1024作为我应该返回的缓冲区大小。我查看了我发现的示例,我这样做的方式与示例相同。我不知道为什么会发生这种情况,有人可以帮助我或指出我的错误吗?
#include <Windows.h>
#include <iostream>
int main()
{
printf("finding notepad window\n");
HWND hwndNotepad = FindWindow(NULL, L"Untitled - Notepad");
if(NULL != hwndNotepad)
{
printf("Find edit control window\n");
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, L"EDIT", NULL);
if(NULL != hwndEdit)
{
printf("- get text length\n");
int textLen = (int)SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0);
printf("textlength: %d\n", textLen);
if(0 < textLen)
{
const int bufferSize = 1024;
char textBuffer[bufferSize] = "";
SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
printf("getting text:\n");
printf("%s\n", textBuffer);
}
else
{
printf("its empty\n");
}
}
else
{
printf("I cant find this control\n");
}
}
else
{
printf("I cant find notepad window. \n");
}
return 0;
}
答案 0 :(得分:3)
这可能是因为NotePad正在使用UNICODE。试试这个
int copied = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
printf("Copied %d chars.\n", copied);
找出被调用者认为复制的字符数。请尝试以下操作来打印UNICODE文本:
const int bufferSize = 1024;
wchar_t textBuffer[bufferSize] = "";
int copied = SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
printf("Copied %d chars.\n", copied);
printf("getting text:\n");
wprintf(L"%ls \n", textBuffer);
如果您使用的是Visual Studio,则可能需要尝试进入项目选项(右键单击项目 - &gt;配置属性 - &gt;常规 - &gt;字符集)并将其设置为ANSI(“未设置” “)。
答案 1 :(得分:1)
无需更改项目设置。您可以使用char
而不是TCHAR
。
#include <Windows.h>
#include <iostream>
int main()
{
printf("finding notepad window\n");
HWND hwndNotepad = FindWindow(NULL, L"Untitled - Notepad");
if(NULL != hwndNotepad)
{
printf("Find edit control window\n");
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, L"EDIT", NULL);
if(NULL != hwndEdit)
{
printf("- get text length\n");
int textLen = (int)SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0);
printf("textlength: %d\n", textLen);
if(0 < textLen)
{
const int bufferSize = 1024;
TCHAR textBuffer[bufferSize];
SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
printf("getting text:\n");
printf("%s\n", textBuffer);
}
else
{
printf("its empty\n");
}
}
else
{
printf("I cant find this control\n");
}
}
else
{
printf("I cant find notepad window. \n");
}
return 0;
}