Универсальное субклассирование окон на Ассемблере
05.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема субклассирования окон уже не один раз поднималась в статьях на этом сайте. Теперь пришло время навести порядок и сделать наиболее удобное и универсальное решение для этой задачи. Воспользуемся функциями SetProp и GetProp, чтобы хранить адреса обработчиков прямо в свойствах окна без заведения дополнительных переменных.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Наименования свойств. Можно переименовать, если конфликтуют с другими
- ; строками в программе
- ;-------------------------------------------------------------------------
- szOld db 'OldWndProc', 0
- szNew db 'NewWndProc', 0
- ;-------------------------------------------------------------------------
- ; Функция субклассирования окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна для субклассирования
- ; SubclassProc - адрес нового обработчика окна
- ;-------------------------------------------------------------------------
- proc SubclassWindow hWnd:DWORD,SubclassProc:DWORD
- pusha
- ; Получить старый обработчик окна
- invoke GetWindowLong,[hWnd],GWL_WNDPROC
- ; Сохранить его в свойствах окна
- invoke SetProp,[hWnd],szOld,eax
- ; Сохранить в свойствах новый обработчик окна
- invoke SetProp,[hWnd],szNew,[SubclassProc]
- ; Назначить окну универсальную функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,CommonSubclassProc
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Субклассировать поле ввода
- invoke GetDlgItem,[hwnddlg],ID_HEX
- stdcall SubclassWindow,eax,EditWindowProc
- ; Субклассировать кнопку
- invoke GetDlgItem,[hwnddlg],ID_BTN
- stdcall SubclassWindow,eax,ButtonProc
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Функция снятия субклассирования с окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна
- ;-------------------------------------------------------------------------
- proc UnSubclassWindow hWnd:DWORD
- pusha
- ; Получить сохраненный обработчик окна
- invoke GetProp,[hWnd],szOld
- or eax,eax
- ; Сохраненного обработчика нет
- jz .loc_ret
- ; Назначить окну старую функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,eax
- ; Удалить сохраненные обработчики
- invoke RemoveProp,[hWnd],szOld
- invoke RemoveProp,[hWnd],szNew
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 1458 | Комментариев: 0