Использование WM_GETTEXT - PullRequest
       45

Использование WM_GETTEXT

0 голосов
/ 08 февраля 2012

Я пытаюсь получить статус текстового поля в моем приложении. Но я не заставляю его работать. Я использую «SendMessage», чтобы получить «WM_GETTEXT», я сохраняю содержимое на символ *.

Я вывожу 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;

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

Указатели понятий

file << * output; напечатает первый элемент массива строк </p>

file << output; распечатать всю строку </p>

0 голосов
/ 13 февраля 2012

София ответ правильный. Однако по умолчанию для проекта Visual Studio по умолчанию создается проект Unicode. Вы получите только первое письмо, если ваш проект Unicode, а не MBCS.

Вы изучили буфер, возвращенный из WM_GETTEXT, чтобы убедиться, что в нем есть вся строка?

Если нет, попробуйте объявить вашу выходную переменную как TCHAR * (быть универсальным) или как wchar_t * и посмотреть, какие результаты вы получите в буфере.

p.s. Нехорошо выделять память с помощью malloc и освобождать ее с помощью delete. Вы должны использовать либо пары malloc / free, либо пары new / delete. Еще более безопасный способ выделить буфер символов - использовать std :: string или использовать std :: wstring для широкой строки.

p.p.s Попробуйте убедиться, что настройки вашего проекта предназначены для многобайтового проекта, а не для проекта Unicode. Тогда все в ответе Софии сработает.

Еще одна вещь ... Просто используйте API GetWindowText () вместо вещи SendMessage. Вот почему это так, поэтому вам не нужно проходить через сложную процедуру приведения указателя к LPARAM или WPARAM. Это более безопасно для типов и даст вам ошибку времени компиляции (лучше, чем ошибки времени выполнения), если ваши типы не совпадают - особенно с Unicode / MBCS и wchar_t / char.

0 голосов
/ 09 февраля 2012

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());

Работать правильно для меня!

...