Всем привет! Стоит такая задача. Нужно получить текст из окна компонента. Есть некое приложение с компонентами, куда периодически выводится текстовая информация. С помощью Spy++ могу определить хендлы окон кампонентов. Думал сначала, что смогу вытащить оттуда текст при помощи GetWindowText или SendMessage(..., WM_GETTEXT, ...), однако это не помогло. Тем же Spy++ определил, что окошкам этих компонентов приходит сообщение WM_ERASEBACKGROUND, а WM_SETTEXT нету. Насколько я понимаю, получается, что информация представлена в этих компонентах как картинка. С помощью Process Explorer'a посмотрел, какие библиотеки подгружает это приложение и увидел там специфичные, насколько понял, разработанные разработчиками данной программы библиотеки. Каким образом можно определить, какая функция в данном приложении отвечает за отрисовку текста? Как вообще бы потрейсить приложение? Есть ли какие-нить готовые решения кроме OllyBbg и прочих отладчиков? Или только отладчиками это можно сделать? Помогите советом или мнением. Заранее благодарен!
Вариант 1. Черезжжооппный. 1) Запускаешь приложение в OllyDbg. 2) Запускаешь АртМани Про и Ищешь строку с текстом. Там же узнаешь адрес памяти, где хранится текст. 3) Находишь этот указатель в ольке. Ставишь хардварный бряк на запись. 4) Находишь кодес, который эту запись производит 5) Сплайсишь. 6) В импорт добавляешь свою дллку, куда ведет сплайс. В дллке получаешь нужный текст Вариант 2. Уё%#щный Открываешь приложение в отладчике и реверсишь. Наблюдаешь как выводится текст на окно. Если через жжоппу - тогда к варианту 1 Если в пределах нормы - получаем текст иными путями, в зависимости от кода Вариант 3. Обычный Перепроверяешь свой код на ошибки. Есть большая вероятность, что ты просто не находишь нужное дочернее окно.
int2e Спасиб за ответ! Мне больше понравился 3 вариант . HWND для компонента беру из Spy++ и дальше GetWindowText: Код (Text): ... HWND hWnd = HWND(0x00030056); CHAR chMsg[256] = {0}; GetWindowText(hWnd, chMsg, 255); ... В результате в chMsg[] пусто, GetLastError() = 0. С окнами других приложений, например, NOTEPAD.EXE, такой вариант работает. Проблема в том, что я не знаю какую функцию перехватить и какие у нее параметры (один из которых должен содержать текст). Вот мне и нужно найти функцию (в каком модуле она расположена) и определить ее параметры. А сам перехват сделать, наверное, не составит большого труда.
а тебе не приходило в голову, что hwnd меняются от раза к разу? а вот поискать по имени и классу - это надежнее!
max7C4 Да, конечно. При каждом запуске приложения в Spy++ заного получаю информацию об окошках... Я уже говорил, что там, похоже, картинка а не текст. Распознавать не охото. Хочу перехватить функцию, которая получает текст и потом отрисовывает его на окне компонента. Но не знаю как найти эту функцию и какие у нее параметры и в каком модуле она располагается.
Ну если отрисовывает, то есть не так много вариантов: TextOut / DrawText или могли через GDI+ вывести текст (не помню чем, ищется по GDI+ Flat API).