从另一个窗口的控件获取文本的问题

时间:2013-12-20 14:47:29

标签: c++ sendmessage

我正在尝试使用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;
}

屏幕截图:http://i.imgur.com/bUhVqlq.png

2 个答案:

答案 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;
}