Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Универсальное субклассирование окон на Ассемблере
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
Окно с возможностью клика сквозь него
15.11.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Окно с возможностью клика сквозь него
Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.
Читать статью целиком »
Просмотров: 1579 | Комментариев: 0
Программное выключение нескольких мониторов
04.11.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Программное выключение нескольких мониторов
На технических форумах в этих ваших интернетах периодически поднимается тема о программном выключении мониторов. Предлагаются разные решения, чаще всего просто бездумно скопированные с других сайтов или более-менее адаптированные под требуемый язык программирования. В свое время я тоже делал что-то подобное. Сегодня хотелось бы провести глобальную работу над ошибками и выдать "на гора" действительно правильное и рабочее решение этой задачи. Заодно я постараюсь подробно рассказать, что не так с другими предлагаемыми решениями.
Читать статью целиком »
Просмотров: 3565 | Комментариев: 49
Как запустить несколько копий Диспетчера задач
03.10.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как запустить несколько копий Диспетчера задач
Если запустить стандартный Диспетчер задач Windows, а потом попробовать запустить его еще раз, то вторая копия не запустится, просто активируется первая запущенная копия. Я не знаю, зачем это было сделано, но какая-то причина наверняка есть. Элегантного решения с параметром в командной строке, как было в случае с regedit, у taskmgr нет. В подобных случаях я придерживаюсь принципа, что если нельзя, но очень хочется, то можно.
Читать статью целиком »
Просмотров: 3161 | Комментариев: 10
Вывод изображения на Ассемблере с помощью OLE
21.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже разбирал загрузку и вывод изображения с помощью GDI+, но это далеко не единственный способ загрузки изображения из файла. В дополнение к этой теме предлагаю рассмотреть еще один способ, как можно загрузить изображение из файла средствами OLE. Сперва пропишем GUID объекта IID_IPicture и создадим структуру для методов интерфейса IPicture. В MSDN методы перечислены в алфавитном порядке, а не так, как они фактически идут в интерфейсе, имейте это в виду.Code (Assembler) : Убрать нумерацию
- ; GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
- IID_IPicture dd 7BF80980h
- dw 0BF32h
- dw 0101Ah
- db 08Bh, 0BBh, 0h, 0AAh, 0h, 030h, 00Ch, 0ABh
- ; IPicture Interface
- struct IPicture
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IPicture
- get_Handle dd ?
- get_hPal dd ?
- get_Type dd ?
- get_Width dd ?
- get_Height dd ?
- Render dd ?
- set_hPal dd ?
- get_CurDC dd ?
- SelectPicture dd ?
- get_KeepOriginalFormat dd ?
- set_KeepOriginalFormat dd ?
- PictureChanged dd ?
- SaveAsFile dd ?
- get_Attributes dd ?
- SetHdc dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Прочитать файл в память
- invoke _lopen,fname,OF_READ
- cmp eax,-1
- je loc_free_1
- mov ebx,eax
- ; Получить размер файла
- invoke GetFileSize,ebx,NULL
- mov [file_size],eax
- ; Выделить память под файл
- invoke GetProcessHeap
- mov [hProcHeap],eax
- invoke HeapAlloc,[hProcHeap],0,[file_size]
- mov [hLock],eax
- ; Загрузить картинку в память
- invoke _lread,ebx,[hLock],[file_size]
- invoke _lclose,ebx
Читать статью целиком »
Просмотров: 2582 | Комментариев: 0