Blog. Just Blog

Перехват и обработка изменения заголовка окна другого приложения

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В предыдущих примерах обработки системных событий мы рассматривали глобальные события, которые происходят во всей системе. Чтобы завершить эту тему, хотелось бы рассказать о системных событиях, ограниченных конкретным приложением. В качестве примера возьмем перехват и обработку изменения заголовка окна какого-нибудь приложения. Немного констант, некоторые из которых вы уже знаете.
  1. EVENT_OBJECT_NAMECHANGE = 0x800C
  2. WINEVENT_OUTOFCONTEXT   = 0x0000
  3. OBJID_WINDOW            = 0x0000
  4. CHILDID_SELF            = 0x0000
Процесс установки хука немного отличается по используемым параметрам. Чтобы связать обработчик с конкретным процессом, сперва надо получить идентификаторы этого процесса и потока. Для дочерних процессов это вообще не проблема, а для стороннего придется воспользоваться функцией GetWindowThreadProcessId, ведь хэндл обрабатываемого окна мы знаем. В SetWinEventHook указываем полученные идентификаторы.
  1.         ; Найти нужное окно
  2.         invoke  FindWindow,NULL,szName
  3.         ; Сохранить хэндл найденного окна
  4.         mov     [hExample],eax
  5.  
  6.         ; Получить идентификаторы процесса и потока, относящиеся к окну
  7.         invoke  GetWindowThreadProcessId,[hExample],pID
  8.         mov     [tID],eax
  9.  
  10.         ; Установить хук на системные события
  11.         invoke  SetWinEventHook,EVENT_OBJECT_NAMECHANGE,\
  12.                 EVENT_OBJECT_NAMECHANGE,NULL,WinEventProc,\
  13.                 [pID],[tID],WINEVENT_OUTOFCONTEXT
А вот обработчик изменился не сильно. Проверяем, что изменяемый объект - окно, что это действительно нужное нам окно, после этого каким-то образом реагируем на изменение его заголовка.
  1. proc WinEventProc hWinEventHook:DWORD, event:DWORD, hwnd:DWORD,\
  2.                   idObject:DWORD, idChild:DWORD, idEventThread:DWORD,\
  3.                   dwmsEventTime:DWORD
  4.         pusha
  5.         ; Изменяемый объект - окно?
  6.         cmp     [idObject],OBJID_WINDOW
  7.         jne     .loc_ret
  8.  
  9.         ; Изменяется само окно?
  10.         cmp     [idChild],CHILDID_SELF
  11.         jne     .loc_ret
  12.  
  13.         ; Точно-точно изменяется?
  14.         cmp     [event],EVENT_OBJECT_NAMECHANGE
  15.         jne     .loc_ret
  16.  
  17.         ; И меняется именно нужное окно?
  18.         mov     eax,[hwnd]
  19.         cmp     eax,[hExample]
  20.         jne     .loc_ret
  21.         ... 
  22.         ...
  23.         ; Выполняются какие-то действия по факту события
  24.         ... 
  25.         ... 
  26. .loc_ret:
  27.         popa
  28.         ret
  29. endp
Таким образом, например, можно доработать автокликалку для Total Commander, чтобы она висела в фоне и модифицировала заголовок окна программы, мгновенно убирая из него надпись "UNREGISTERED" в случае ее появления.

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

В приложении пример программ с исходными текстами, одна из которых позволяет менять текст в заголовке своего окна, а вторая отслеживает и логирует эти изменения.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Windows.Title.Hook.Demo.zip (4,770 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1067 | Комментариев: 0

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0069 сек.) / Память: 4.5 Mb
Наверх