WM_GETTEXT возвращает только один символ - PullRequest
0 голосов
/ 07 февраля 2019

Я химик, плохо знакомый с программированием, и работаю над сценарием, который поможет мне автоматически обрабатывать некоторые из моих данных.Код, над которым я сейчас работаю, включает использование WM_GETTEXT для получения заголовка дескриптора окна.Однако прямо сейчас буфер символов захватывает только один символ, а не весь заголовок.Похоже, что у кого-то несколько лет назад была похожая проблема (ссылка: http://www.cplusplus.com/forum/beginner/58207/),, которая предполагает, что проблема может быть связана со смешиванием типов данных. Я попытался переключиться на TCHAR, как было предложено, но не могу скомпилировать при этом (ошибка получениячто я не могу преобразовать из "const char [1] в TCHAR [254]). Вот код, который я использую:

int textLen = (int)SendMessage(windowHandle, WM_GETTEXTLENGTH, 0, 0);
std::cout << "The handle length is: " << textLen << std::endl;
const int bufferSize = 254;
char textBuffer[bufferSize] = "";
SendMessage(windowHandle, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);
std::cout << "The handle title is: " << textBuffer << std::endl;

У кого-нибудь есть какие-либо предложения? Я работаю в Microsoft Visual Studio,что, я думаю, может быть частью проблемы, но я не уверен, как это исправить.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Другой ответ правильный, но вы можете рассмотреть возможность использования GetWindowText вместо отправки сообщения.

С GetWindowText, независимо от того, используете ли вы суффикс -A или -W, выполучит некоторую безопасность типов, которая могла бы помочь вам избежать этой проблемы, в первую очередь.

В некоторых случаях GetWindowText может возвращать заголовок, даже если процесс, который владеет целевым окном, завис или не отвечает насообщения своевременно.

0 голосов
/ 07 февраля 2019

Попробуйте позвонить SendMessageA вместо SendMessage - это указывает на то, что вы используете символ, а не WCHAR (то есть, каким на самом деле мог быть TCHAR).

В качестве альтернативы, используйте широкосимвольные версии std::cout, то есть std::wcout, и везде используйте TCHAR / WCHAR (включая объявление textBuffer).

По сути, вы смешиваете широкие строкисо струнами старой школы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...