Blog. Just Blog

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

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

Перехват и обработка 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.

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

Передача данных приложению с помощью WM_DROPFILES

09.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обрабатывать перетаскивание файлов в окно программы мы уже умеем, а сегодня узнаем, как сэмулировать это действие, то есть передать стороннему приложению список файлов через отправку сообщения WM_DROPFILES.

Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
  1. struct DROPFILES
  2.         pFiles dd ?
  3.         pt     POINT
  4.         fNC    dd ?
  5.         fWide  dd ?
  6. ends
Перед отправкой сообщения окну надо заполнить структуру DROPFILES. Значимыми полями являются pFiles - указатель на список файлов относительно начала структуры, и fWide - в каком формате передаются имена файлов, ASCII или юникод. Хотя на расположение списка файлов в памяти нет явных ограничений, обычно этот список размещается прямо за структурой и завершается нулевым байтом. Соответственно, указатель на этот список будет равен размеру структуры DROPFILES. Память под все это дело надо выделять с учетом нулевых разделителей между именами файлов и завершающим нулем.

Ну и сам код. Определяем размер и выделяем память, заполняем структуру и имена файлов, отправляем сообщение целевому окну.
  1.         ; Размер структуры DROPFILES
  2.         mov     ebx,sizeof.DROPFILES
  3.         inc     ebx
  4.  
  5.         ; Длина имени первого файла
  6.         invoke  lstrlen,file1
  7.         add     ebx,eax
  8.         inc     ebx
  9.  
  10.         ; Длина имени второго файла
  11.         invoke  lstrlen,file2
  12.         add     ebx,eax
  13.         inc     ebx
  14.  
  15.         ; Выделить память
  16.         invoke  GlobalAlloc,GMEM_SHARE+GMEM_MOVEABLE+GMEM_ZEROINIT,ebx
  17.         mov     [mem],eax
  18.         invoke  GlobalLock,eax
  19.         mov     [dfiles],eax
  20.  
  21.         ; Заполнить структуру DROPFILES
  22.         mov     edi,[dfiles]
  23.         mov     [edi+DROPFILES.pFiles],sizeof.DROPFILES
  24.         mov     [edi+DROPFILES.pt.x],0
  25.         mov     [edi+DROPFILES.pt.y],0
  26.         mov     [edi+DROPFILES.fNC],FALSE
  27.         mov     [edi+DROPFILES.fWide],FALSE
  28.         add     edi,sizeof.DROPFILES
  29.  
  30.         ; Дописать к ней передаваемые файлы
  31.         mov     esi,file1
  32. @@:
  33.         lodsb
  34.         stosb
  35.         or      al,al
  36.         jnz     @b
  37.  
  38.         mov     esi,file2
  39. @@:
  40.         lodsb
  41.         stosb
  42.         or      al,al
  43.         jnz     @b
  44.  
  45.         ; Завершающий нулевой байт
  46.         xor     eax,eax
  47.         stosb
  48.  
  49.         ; Отправить сообщение WM_DROPFILES
  50.         invoke  GlobalUnlock,[mem]
  51.         invoke  PostMessage,[destination_window],WM_DROPFILES,[mem],0
  52.         invoke  GlobalFree,[mem]
Обратите внимание, что отправка сообщения выполняется через PostMessage, иначе целевое приложение по какой-то причине может подвиснуть.

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

Получение информации о заголовке окна

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

Получение информации о заголовке окна

Манипулировать кнопками в заголовке окна мы уже научились. А как узнать, какие кнопки отображаются в заголовке окна и в каком они состоянии? Конечно, можно пройтись по стилям, по меню, но правильнее будет воспользоваться следующей информацией. Мне кажется, она станет хорошим дополнением к статье об управлении кнопками в заголовке окна.

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

Выпадающий список (Combobox) с динамическим поиском

17.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем усовершенствовать элемент Combobox. Создавать его мы научились, красивыми иконками снабдили, теперь давайте добавим полнотекстовый поиск по списку и фильтрацию. Справедливости ради стоит отметить, что зачаточный вариант поиска в комбобоксе все-таки присутствует. Если ввести какую-нибудь строку, а затем открыть выпадающий список, то курсор будет установлен на первом найденном пункте списка, который начинается с введенной строки. Я же хочу сделать так, чтобы в списке оставались только те пункты, в которых присутствует введенная строка, причем не только в начале, а вообще. Например, если я введу "Jo", то в списке должны остаться как "John Smith", так и "Patrick Joel".

Изменения поля ввода будем отлавливать штатными средствами в обработчике комбобокса. Это должно быть уведомление CBN_EDITUPDATE. После этого сохраняем введенную строку в сухом прохладном месте, очищаем список, а затем заполняем его, но уже только теми пунктами, где присутствует введенная строка.
  1.         cmp     [msg],WM_COMMAND
  2.         je      wmcommand
  3.         ...
  4.         ...
  5. wmcommand:
  6.         cmp     [wparam], CBN_EDITUPDATE shl 16 + ID_LIST
  7.         je      combobox_filter
Тут я использовал обработчик главного окна, но никто не запрещает воспользоваться субклассированием, а то и вовсе нарисовать какой-нибудь универсальный модуль для работы с комбобоксами.

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

Как защитить приложение от снятия скриншота

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

Как защитить приложение от снятия скриншота

Про ценность информации в современном цифровом мире можно рассказывать долго, но я этого делать не буду. Только хочу упомянуть такую безобидную на первый взгляд штуку, как скриншот экрана. "Алло, техподдержка, у меня тут программа что-то пишет непонятно" - "Пришлите скриншот". Тык в PrintScreen, вставить в письмо, отправить. Знакомая ситуация? А то, что в это время на экране может быть служебная или вовсе конфиденциальная информация, и куда она пойдет дальше, об этом мало кто думает. Если данные, отображаемые в окнах приложения, даже случайно не должны быть переданы не по назначению, то разработчикам софта стоит об этом позаботиться. На скриншоте как раз пример скриншота окна с защитой от скриншота (извините). Само окно есть, но его содержимое не отображается.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0049 сек.) / Память: 4.5 Mb
Наверх