Blog. Just Blog

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

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

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

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, не совпадает со стандартными хэндлами курсоров. Объяснить причину такого поведения системы я не могу. Если вам это необходимо, то можно составить табличку соответствия.

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

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

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

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

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

Читать статью целиком »
Просмотров: 596 | Комментариев: 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.

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

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

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

Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
  1. struct DROPFILES
  2.         pFiles dd ?
  3.         pt     POINT
  4.         fNC    dw ?
  5.         fWide  dw ?
  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, иначе целевое приложение по какой-то причине может подвиснуть.

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

Ввод пароля в консоли

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

Ввод пароля в консоли

Не знаю как вам, а мне очень не нравится метод ввода пароля в никсовой консоли. Введенные символы не показываются даже замаскированными, ввод не реагирует на вставку пароля из буфера обмена, а главное, нельзя удалять ошибочно введенный символ. Я понимаю, безопасность, все дела, но неудобно же! И решил я сделать свой вариант ввода пароля для консольных приложений. Чтобы и "звездочки" показывались, и вставка работала, и символы можно было удалять. Вот что у меня получилось.

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

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