Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

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

03.08.2020 | Категория: Образ мышления: 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" в случае ее появления.

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

Читать статью целиком »
Просмотров: 373 | Комментариев: 0

Как получить список ярлыков на рабочем столе

25.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как получить список ярлыков на рабочем столе

Если вы интересуетесь компьютерами и любите порядок в своем электронном хозяйстве, то наверняка встречали программы для сохранения и восстановления позиций ярлыков на рабочем столе. Судя по многочисленным отзывам пользователей на различных софтовых порталах и форумах, такие программы действительно востребованы. Давайте посмотрим, каким образом можно получить список и позиции ярлыков рабочего стола.

Читать статью целиком »
Просмотров: 572 | Комментариев: 7

Перехват и обработка изменения курсора

24.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Закрепим материал по системным событиям. В сегодняшнем примере отработаем перехват изменения формы курсора. Начнем с описания отсутствующих структур и констант, которые будут использоваться в нашем коде.
  1. struct CURSORINFO
  2.     cbSize      dd ?
  3.     flags       dd ?
  4.     hCursor     dd ?
  5.     ptScreenPos POINT
  6. ends
  7.  
  8. EVENT_OBJECT_NAMECHANGE = 0x800C
  9. WINEVENT_OUTOFCONTEXT   = 0x0000
  10. OBJID_CURSOR            = 0xFFFFFFF7
Затем, как и в предыдущем примере, устанавливаем хук на системные события. В зависимости от ситуации, сделать это можно при инициализации приложения или в какой-нибудь другой определенный вами момент.
  1.         ; Установить хук на системные события
  2.         invoke  SetWinEventHook,EVENT_OBJECT_NAMECHANGE,\
  3.                 EVENT_OBJECT_NAMECHANGE,NULL,WinEventProc,\
  4.                 0,0,WINEVENT_OUTOFCONTEXT
Ну и сам обработчик системного события. Тут первым делом проверяется, что изменившийся объект является курсором, потом на всякий случай проверяем тип события, если их планируется несколько. Вся необходимая информация об изменившемся курсоре получается при помощи функции GetCursorInfo. Это хэндл нового курсора, его координаты и флаги отображения.
  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_CURSOR
  7.         jne     .loc_ret
  8.  
  9.         ; Курсор изменяется?
  10.         cmp     [event],EVENT_OBJECT_NAMECHANGE
  11.         jne     .loc_ret
  12.  
  13.         ; Получить инфомрацию о курсоре
  14.         mov     [pci.cbSize],sizeof.CURSORINFO
  15.         invoke  GetCursorInfo,pci
  16.         ; Курсор изменился?
  17.         mov     eax,[pci.hCursor]
  18.         cmp     eax,[hCursor]
  19.         ; Нет, пропустить
  20.         je      .loc_ret
  21.         ; Да, сохранить хэндл нового курсора
  22.         mov     [hCursor],eax
  23.         ; В структуре CURSORINFO содержится информация о курсоре
  24.         ...
  25.         ...
  26. .loc_ret:
  27.         popa
  28.         ret
  29. endp
В обработчике проверяется хэндл старого и нового курсора, так как система щедро сыплет событиями даже когда курсор просто стоит на месте. Обработчик реагирует только когда хэндл курсора изменился, то есть изменилась его форма. Что интересно, хэндл курсора, возвращаемый в структуре CURSORINFO, не совпадает со стандартными хэндлами курсоров. Объяснить причину такого поведения системы я не могу. Если вам это необходимо, то можно составить табличку соответствия.

Читать статью целиком »
Просмотров: 352 | Комментариев: 0

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

14.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

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

Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений Windows. Сегодня копнем немного глубже, а именно научимся программно определять, что система ожидает эту самую перезагрузку. Зачем это нужно? Например, такое состояние означает, что некоторые файлы из пакета обновлений установлены не до конца, а значит лучше не производить никаких рискованных действий типа массированных инсталляций.

Читать статью целиком »
Просмотров: 564 | Комментариев: 0

Перехват и обработка Alt+Tab

13.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня поэкспериментируем с системными событиями. Это очень мощный и интересный инструмент, с помощью которого можно оперативно реагировать на события до того момента, как они дойдут до приложения. В качестве примера будем перехватывать окно переключения процессов, которое появляется при нажатии комбинации Alt+Tab, а также обрабатывать выбор элементов в этом окне. Начнем с описания нужных нам констант.
  1. EVENT_SYSTEM_SWITCHSTART = 0x0014
  2. EVENT_SYSTEM_SWITCHEND   = 0x0015
  3. EVENT_OBJECT_FOCUS       = 0x8005
  4.  
  5. WINEVENT_OUTOFCONTEXT    = 0x0000
  6. WINEVENT_SKIPOWNPROCESS  = 0x0002
Затем при инициализации окна или где-нибудь в начале приложения при помощи функции SetWinEventHook подписываемся на системные события EVENT_SYSTEM_SWITCHSTART и EVENT_SYSTEM_SWITCHEND. Правильнее будет сказать, что на интервал всех событий с идентификаторами, расположенными между ними, включая границы. Но, поскольку они идут друг за другом, то получается, что только на эти два события.
  1. wminitdialog:
  2.         ; Обнулить хэндл окна Alt+Tab
  3.         mov     [hwndat],0
  4.         invoke  SetWinEventHook,EVENT_SYSTEM_SWITCHSTART,EVENT_SYSTEM_SWITCHEND,\
  5.                 NULL,WinEventProc,0,0,WINEVENT_OUTOFCONTEXT+WINEVENT_SKIPOWNPROCESS
  6.         mov     [hook],eax
Останется только оформить обработчик событий WinEventProc. Для большей универсальности он будет также отвечать за обработку выбора элементов в окне Alt+Tab.

Читать статью целиком »
Просмотров: 543 | Комментариев: 5

01 ... 06 07 08 09 10 11 12 ... 51
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.16 сек. / MySQL: 3 (0.0655 сек.) / Память: 5 Mb
Наверх