Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8

Получить текст из MessageBox

12.04.2012, 21:02. Показов 3621. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть проблема получения текста из MessageBox другого процесса, проблема эта - Delphi, на нем написана программа.

Ставлю хук WH_CBT, дальше HCBT_ACTIVATE и т.д., тут собственно проблем нету.

Пробовал через SendMessage (WM_GETTEXT) и GetWindowText, но глухо.
Как же это осуществить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2012, 21:02
Ответы с готовыми решениями:

Текст в MessageBox
Как можно увеличить текст в MessageBox?

Текст как в MessageBox
Как возможно писать таким текстом как на скриншоте в MessageBox?

Разноцветный текст в MessageBox
Добрый вечер. Подскажите,пожалуйста,как вывести в MessageBox текст разным цветом. Заранее спасибо.

19
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 14:10
Slavvkko, SendMessage (WM_GETTEXT) GetWindowText ну и что ты этим хотел достичь?
У меседж бокса текст на кнопке(ах) их может быть до 3-х штук, текст в строке(это контрол окна, разве он GetWindowText получается, конечно нет он вытаскивается с помощью GetDlgItemText, т.к. ID вещь очень неопределённая вот я и сделал пробор ID от 100000 до 0, как раз всё выхватываем). Кроме всего прочего у месседжбокса может быть а может и нет тайтл окна, вот его ты мог максимум вытащить своими методами.
Ниже 2 проекта (верней один просто как проект выскакивающего меседжбокса, а вот второй проект вытащит все тексты из первого попавшегося MessageBox а в системе, при желании код легко изменить для вытаскивания инфы из всех MessageBox-ов присутсвующих в данный момент в системе)
Выскакивающий меседж бокс
C
1
2
3
4
5
6
7
8
9
#include <windows.h>
 
int main()
{
    HWND hWnd = GetForegroundWindow();
    ShowWindow(hWnd,SW_HIDE);
    MessageBox(NULL,"Now program will be closed","",MB_OK);
    return 0;
}
Вытаскиватель текстов
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
#include <stdio.h>
 
int main()
{
    long i;
    HWND hWnd = NULL;
    char sMsg[256] = {0};
    system("chcp 1251");
    while(TRUE)
    {
        //"#32770" äà ïðàâåëüíî ïîíÿëè ó MessageBox êëàññíºéì èìåííî òàêîé
        if(!(hWnd = FindWindow("#32770",NULL)))
            printf("MessageBox is not detected\n");
        else
        {
            for(i = 100000; 0 < i; i--)
            {
                if(GetDlgItemText(hWnd,i,sMsg,256))
                    printf("MessageBox says (in ID %d) : %s\n",i, sMsg);
            }
            system("pause");
        }
    }
    return 0;
}
Миниатюры
Получить текст из MessageBox  
Вложения
Тип файла: rar MBox.exe.rar (7.6 Кб, 12 просмотров)
Тип файла: rar GetMsgText.exe.rar (14.4 Кб, 13 просмотров)
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 14:13
PS:Хук тебе для твоей затие вообще не нужен, одно НО создатель программы
Цитата Сообщение от Slavvkko Посмотреть сообщение
Delphi, на нем написана программа
мог смастерить окно причём внешне ты его врядли отличить от меседжбокса сможешь, так что сначала погляди через список HWND что там у тебя віскакивает, а потом уже припаивай мой алгоритм...
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 14:27  [ТС]
Хук нужен что бы отловить момент появления окна.
Спасибо за помощь, но, как выяснилось окно создается не функцией MessageBox, а ShowMessage .
Через Spy+ посмотрел - у него нету окон с текстом (static, например). Есть только Кнопка.

Похоже там текст рисуется через DrawText, верно? Как в таком случае получить текст? Перехватывать DrawText?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 14:32
Цитата Сообщение от Slavvkko Посмотреть сообщение
Похоже там текст рисуется через DrawText, верно? Как в таком случае получить текст? Перехватывать DrawText?
- моё мнение не перехватишьРешение наверное такое - отловить выскочившее окно, загнать в буфер битмапом и распознать текст, DrawText никогда не перехватывал, хотя по идее WH_SYSMSGFILTER должен как то реагировать на вывод даже пусть и DrawText.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 14:36
Вот отработка Spyx для меседжбокса приведенного в моём примере
Миниатюры
Получить текст из MessageBox  
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 14:42  [ТС]
Пример такого окна (друг написал ShowMessage на Delphi):

Клацнул CTRL+C по окну, получил:
Code
1
2
3
4
5
6
7
---------------------------
Project1
---------------------------
Какое-то сообщение!111
---------------------------
OK   
---------------------------
Подскажите, как можно скопировать это через winapi?
Изображения
 
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 14:48
Slavvkko, можешь бросить готовый exe-ник программки в которой хочешь перехватить текст из окна
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 14:50  [ТС]
Вот

(добавляем длину месаги)
Вложения
Тип файла: zip Project1.zip (201.6 Кб, 19 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 15:43
Slavvkko, покопай GetBoxResultsHRC
Вот код который отлавливает HDC твоей TMessageForm

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <windows.h>
#include <stdio.h>
 
int main()
{
    long i;
    HWND hWnd = NULL;
    HDC hDC   = NULL;
    DWORD dwPenRGB   = 0;
    DWORD dwBrushRGB = 0;
    char sMsg[256] = {0};
    system("chcp 1251");
    while(TRUE)
    {
        if(!(hWnd = FindWindow("TMessageForm",NULL)))
            printf("MessageBox is not detected\n");
        else
        {
            if(GetWindowText(hWnd,sMsg,256))
                printf("TMessageForm WND TEXT : %s\n",sMsg);
            if(hDC = GetWindowDC(hWnd))
                printf("HDC captured          : 0x%p\n",hDC);
        }
        system("pause");
    }
    return 0;
}
Отработка
Текущая кодовая страница: 1251
TMessageForm WND TEXT : Project1
HDC captured : 0xAE01198D
Для продолжения нажмите любую клавишу . . .

Добавлено через 1 минуту
Цитата Сообщение от Slavvkko Посмотреть сообщение
(добавляем длину месаги)
- погоди так тебе нужно что то своё в том меседжбоксе написать - это как два пальца или всё же тебе надо текст отловить?
1
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 15:55  [ТС]
"(добавляем длину месаги)" было написано для обхода ограничения длинны сообщения на форуме

Мне нужно прочитать этот текст.

По HDC я думаю ничего не получится, лучше "скопировать" окно.
Я совсем недавно только начал учить winapi, и потому мало что знаю .

Поэтому тут вопрос: Как отправить окну CTRL+C, надо что то типа "эмуляции" нажатий клавиатуры?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 16:12
Кстати вот вариант "издевательства на меседж боксом"
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
#include <stdio.h>
 
#define BLK RGB(0,0,0)
 
int main()
{
    HWND hWnd = NULL;
    HDC hDC   = NULL;
    HPEN hPen = NULL;
    char sMsg[256] = {0};
    system("chcp 1251");
    while(TRUE)
    {
        if(!(hWnd = FindWindow("TMessageForm",NULL)))
            printf("MessageBox is not detected\n");
        else
        {
            if(GetWindowText(hWnd,sMsg,256))
                printf("TMessageForm WND TEXT : %s\n",sMsg);
            if(hDC = GetWindowDC(hWnd))
            {
                printf("HDC captured          : 0x%p\n",hDC);
                if(hPen = CreatePen(2,PS_SOLID,BLK))
                {
                    printf("Pen created           : 0x%p ",hPen);
                    if(!SelectObject(hDC,hPen))
                        printf("Pen not selected\n");
                    else
                        printf("Pen is selected\n");
                    strcpy(sMsg,"Ìîé òåêñò â TMessageForm");
                    SetBkColor(hDC,RGB(255,255,255));
                    
                    MoveWindow(hWnd,300,400,200,100,TRUE);
                    TextOut(hDC,5,40,sMsg,strlen(sMsg));
                    SetForegroundWindow(hWnd);
                }
            }   
 
        }
        system("pause");
    }
    return 0;
}
Миниатюры
Получить текст из MessageBox  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.04.2012, 16:14
Цитата Сообщение от Slavvkko Посмотреть сообщение
Мне нужно прочитать этот текст.
- как делать это в приложениях писанных в API я показал, в Delphi текс возможно и вправду рисуется, поєтому я не случайно написал об этом
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
покопай GetBoxResultsHRC
0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
13.04.2012, 17:07
Цитата Сообщение от Slavvkko Посмотреть сообщение
Как отправить окну CTRL+C, надо что то типа "эмуляции" нажатий клавиатуры?
WM_COPY

А можно получить ту, программку, в которой вы пытаетесь получить текст из окна?
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 18:46  [ТС]
Цитата Сообщение от Unwebo Посмотреть сообщение
WM_COPY

А можно получить ту, программку, в которой вы пытаетесь получить текст из окна?
WM_COPY пробовал, не срабатывает.
Программа на предыдущей странице. Или вы про программу, которой я ищу текст?

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
покопай GetBoxResultsHRC
Увы, но я нашел только одну статью на эту тему, и не понял как это использовать .
0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
13.04.2012, 19:46
Текст рисуется с помощь DrawTextA.
Помимо текста сообщения DrawText'ом рисуется и "ОК" на кнопке
Думаю, без внедрения в процесс и патчинга участка кода, вызвыающего сообщение, никак...
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
13.04.2012, 20:02  [ТС]
Цитата Сообщение от Unwebo Посмотреть сообщение
Текст рисуется с помощь DrawTextA.
Помимо текста сообщения DrawText'ом рисуется и "ОК" на кнопке
Думаю, без внедрения в процесс и патчинга участка кода, вызвыающего сообщение, никак...
Текст можно получить копированием окна в буфер.

Но как послать окну CTRL+C?
0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
14.04.2012, 00:32
Цитата Сообщение от Slavvkko Посмотреть сообщение
Текст можно получить копированием окна в буфер.
Что вы имеете в виду под "копированием окна в буфер"??

Цитата Сообщение от Slavvkko Посмотреть сообщение
Но как послать окну CTRL+C?
CTRL+C копирует выделенный участок кода, и хоть как вы его послыайте.
Но если очень нужно, то я уже писал про WM_COPY, можно оспользовать keybd_event, или SendInput, но последние 2 просто эмулируют нажатие клавишь.
0
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 8
14.04.2012, 01:47  [ТС]
Цитата Сообщение от Unwebo Посмотреть сообщение
Что вы имеете в виду под "копированием окна в буфер"??
Вот это:
Цитата Сообщение от Slavvkko Посмотреть сообщение
Клацнул CTRL+C по окну, получил:
---------------------------
Project1
---------------------------
Какое-то сообщение!111
---------------------------
OK *
---------------------------
0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
14.04.2012, 04:55
Щас сообразим

Добавлено через 1 час 20 минут
SendMessag'ем не получается отправить сообщение...
Как вариант, установить на окно фокус - SetForegroundWindow и через keybd_event или SendInput нажать клавиши
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2012, 04:55
Помогаю со студенческими работами здесь

Из txt файла вывести текст в MessageBox
Здравствуйте у меня такой вопрос как из txt файла вывести текст в MessageBox допустим написал я в txt привет потом запустил программу с той...

Как правильно передавать текст в MessageBox?
if (Edit1-&gt;Text==&quot;&quot;) {MessageBox(0,&quot;Íå çàäàíà ðàçìåðíîñòü&quot;,&quot;Îøèáêà&quot;,MB_OK); return; } Прописано вроде правильно,в прошлой проге...

Как в MessageBox выровнять текст по центру
Что-то не получается в MessageBox выровнять текст по центру. Текст из нескольких строк MessageBox.Show(&quot;string1\n string2&quot;

Считать текст с EditBox и вывести в MessageBox
Добрый вечер. Столкнулся с проблемой считывания из EditBox'а. создал две переменные едитбокса и кнопки hButton=...

Вывести текст с новой строки в MessageBox
Подскажите, пожалуйста, как вывести текст с новой строки в MessageBox (программа уже выводит &quot;KNUBA&quot;).586 .model flat, stdcall ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru