Как прочитать текст MessageBox с помощью WinAPI - PullRequest
4 голосов
/ 12 мая 2011

Как прочитать сообщение стандартного окна сообщений Win (Info)?

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

SendMessage(this.HandleControl, WM_GETTEXT, builder.Capacity, builder);

Я могу только прочитать заголовок окна сообщения или текст кнопки, но не само сообщение.

спасибо.

Примечания (из вопросов и ответов):

this.HandleControl - это обработчик окна сообщения

Spy ++ не показывает дочерних элементов управления на кнопке. Именно это заставило меня задуматься о том, что у ящиков сообщений есть свой способ сохранить текст без меток

Это унаследованное приложение, написанное на Delphi, класс кнопки - TButton, как в Spy ++, но все же нет никаких элементов управления, кроме кнопки внутри диалогового окна.

После проверки окна блокнота, оба изображения и текст «выбираются», я думаю, мое приложение не использует стандартный блок сообщений. Тем не менее, как я могу извлечь текст из вещи? Я вижу, что никакие метки в моем приложении delphi не могут быть выбраны инструментом Spy ++ Finder.

Ответы [ 2 ]

7 голосов
/ 12 мая 2011

Текст сообщения находится в элементе управления меткой в ​​модальном диалоговом окне MessageBox.Вы должны получить дескриптор окна для диалогового окна MessageBox (win32 API FindWindow), затем получить дескриптор окна для элемента управления (win32 API GetDlgItem) и затем извлечь текст из этого окна win32 API GetWindowText).

EDIT --

TCHAR text[51] = {0};
HWND msgBox = ::FindWindow(NULL, TEXT("MessageBoxCaption"));
HWND label = ::GetDlgItem(msgBox, 0xFFFF);
::GetWindowText(label, text, sizeof(text)-1);
2 голосов
/ 07 ноября 2014

Попробуйте смоделировать операцию копирования (Ctrl-C), затем извлеките текст из буфера обмена: ящики сообщений позволяют копировать весь контент таким образом (если они правильно сделаны).

ОП отметил, что: это сработало, спасибо.Я мог бы в конечном итоге сделать это таким образом.В идеале мы хотели сохранить независимость нашей реализации, но выбирая между выделенным ПК и OCR, я бы, вероятно, выбрал первый путь.

Лично я проверил это в Delphi 6, и он выглядиткак это:

---------------------------
Confirm
---------------------------
You are about to close the program
WARNING: Are you sure?
---------------------------
Yes   No   
---------------------------

Примечание: Это основано на ответе, который был предложен "Стефаном" в комментариях к первоначальному Вопросу

...