Перехват и обработка изменения курсора
Закрепим материал по системным событиям. В сегодняшнем примере отработаем перехват изменения формы курсора. Начнем с описания отсутствующих структур и констант, которые будут использоваться в нашем коде.Code (Assembler) : Убрать нумерацию
- struct CURSORINFO
- cbSize dd ?
- flags dd ?
- hCursor dd ?
- ptScreenPos POINT
- ends
- EVENT_OBJECT_NAMECHANGE = 0x800C
- WINEVENT_OUTOFCONTEXT = 0x0000
- OBJID_CURSOR = 0xFFFFFFF7
Code (Assembler) : Убрать нумерацию
- ; Установить хук на системные события
- invoke SetWinEventHook,EVENT_OBJECT_NAMECHANGE,\
- EVENT_OBJECT_NAMECHANGE,NULL,WinEventProc,\
- 0,0,WINEVENT_OUTOFCONTEXT
Code (Assembler) : Убрать нумерацию
- proc WinEventProc hWinEventHook:DWORD, event:DWORD, hwnd:DWORD,\
- idObject:DWORD, idChild:DWORD, idEventThread:DWORD,\
- dwmsEventTime:DWORD
- pusha
- ; Изменяемый объект - курсор?
- cmp [idObject],OBJID_CURSOR
- jne .loc_ret
- ; Курсор изменяется?
- cmp [event],EVENT_OBJECT_NAMECHANGE
- jne .loc_ret
- ; Получить инфомрацию о курсоре
- mov [pci.cbSize],sizeof.CURSORINFO
- invoke GetCursorInfo,pci
- ; Курсор изменился?
- mov eax,[pci.hCursor]
- cmp eax,[hCursor]
- ; Нет, пропустить
- je .loc_ret
- ; Да, сохранить хэндл нового курсора
- mov [hCursor],eax
- ; В структуре CURSORINFO содержится информация о курсоре
- ...
- ...
- .loc_ret:
- popa
- ret
- endp
В приложении пример программы с исходным текстом, которая отслеживает изменение курсора и показывает его хэндл и координаты события.
Просмотров: 1096 | Комментариев: 3
Метки: Assembler
Внимание! Статья опубликована больше года назад, информация могла устареть!
Добавить комментарий
Заполните форму для добавления комментария
Например как в программах Window Detective или Process Explorer, когда выбирается окно при помощи курсора-мишени.
Курсор меняется функцией SetSystemCursor, а восстанавливается SystemParametersInfo(SPI_SETCURSORS, 0, NULL, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE)
А вот между вызовами этих методов, пока не выбрано нужное окно, нужно запретить изменять курсор. Гугление пока не дало положительных результатов...