Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Универсальное субклассирование окон на Ассемблере

05.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема субклассирования окон уже не один раз поднималась в статьях на этом сайте. Теперь пришло время навести порядок и сделать наиболее удобное и универсальное решение для этой задачи. Воспользуемся функциями SetProp и GetProp, чтобы хранить адреса обработчиков прямо в свойствах окна без заведения дополнительных переменных.
  1. ;-------------------------------------------------------------------------
  2. ; Наименования свойств. Можно переименовать, если конфликтуют с другими 
  3. ; строками в программе
  4. ;-------------------------------------------------------------------------
  5. szOld   db 'OldWndProc', 0
  6. szNew   db 'NewWndProc', 0
  7.  
  8. ;-------------------------------------------------------------------------
  9. ; Функция субклассирования окна
  10. ;-------------------------------------------------------------------------
  11. ;  hWnd - хэндл окна для субклассирования
  12. ;  SubclassProc - адрес нового обработчика окна
  13. ;-------------------------------------------------------------------------
  14. proc SubclassWindow hWnd:DWORD,SubclassProc:DWORD
  15.         pusha
  16.  
  17.         ; Получить старый обработчик окна
  18.         invoke  GetWindowLong,[hWnd],GWL_WNDPROC
  19.         ; Сохранить его в свойствах окна
  20.         invoke  SetProp,[hWnd],szOld,eax
  21.         ; Сохранить в свойствах новый обработчик окна
  22.         invoke  SetProp,[hWnd],szNew,[SubclassProc]
  23.         ; Назначить окну универсальную функцию обработки
  24.         invoke  SetWindowLong,[hWnd],GWL_WNDPROC,CommonSubclassProc
  25.  
  26.         popa
  27.         ret
  28. endp
Использование функции простейшее. Обычно на этапе инициализации окна нужным элементам назначаются собственные обработчики:
  1.         ; Субклассировать поле ввода
  2.         invoke  GetDlgItem,[hwnddlg],ID_HEX
  3.         stdcall SubclassWindow,eax,EditWindowProc
  4.  
  5.         ; Субклассировать кнопку
  6.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  7.         stdcall SubclassWindow,eax,ButtonProc
Нечасто, но может возникнуть ситуация, когда надо отменить субклассирование какого-либо элемента диалогового окна. Не проблема, есть и для этого своя функция.
  1. ;-------------------------------------------------------------------------
  2. ; Функция снятия субклассирования с окна
  3. ;-------------------------------------------------------------------------
  4. ;  hWnd - хэндл окна
  5. ;-------------------------------------------------------------------------
  6. proc UnSubclassWindow hWnd:DWORD
  7.         pusha
  8.  
  9.         ; Получить сохраненный обработчик окна
  10.         invoke  GetProp,[hWnd],szOld
  11.         or      eax,eax
  12.         ; Сохраненного обработчика нет
  13.         jz      .loc_ret
  14.         ; Назначить окну старую функцию обработки
  15.         invoke  SetWindowLong,[hWnd],GWL_WNDPROC,eax
  16.         ; Удалить сохраненные обработчики
  17.         invoke  RemoveProp,[hWnd],szOld
  18.         invoke  RemoveProp,[hWnd],szNew
  19. .loc_ret:
  20.         popa
  21.         ret
  22. 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 методы перечислены в алфавитном порядке, а не так, как они фактически идут в интерфейсе, имейте это в виду.
  1. ; GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
  2. IID_IPicture       dd 7BF80980h
  3.                    dw 0BF32h
  4.                    dw 0101Ah
  5.                    db 08Bh, 0BBh, 0h, 0AAh, 0h, 030h, 00Ch, 0ABh
  6.  
  7. ; IPicture Interface
  8. struct IPicture
  9.     ; IUnknown
  10.     QueryInterface dd ?
  11.     AddRef         dd ?
  12.     Release        dd ?
  13.  
  14.     ; IPicture
  15.     get_Handle     dd ?
  16.     get_hPal       dd ?
  17.     get_Type       dd ?
  18.     get_Width      dd ?
  19.     get_Height     dd ?
  20.     Render         dd ?
  21.     set_hPal       dd ?
  22.     get_CurDC      dd ?
  23.     SelectPicture  dd ?
  24.     get_KeepOriginalFormat dd ?
  25.     set_KeepOriginalFormat dd ?
  26.     PictureChanged dd ?
  27.     SaveAsFile     dd ?
  28.     get_Attributes dd ?
  29.     SetHdc         dd ?
  30. ends
Итак, у нас есть файл с изображением, который надо загрузить в память и затем выполнить с ним нужные действия, например, вывести на форму. Первым делом загружаем его целиком в память.
  1.         ; Прочитать файл в память
  2.         invoke  _lopen,fname,OF_READ
  3.         cmp     eax,-1
  4.         je      loc_free_1
  5.         mov     ebx,eax
  6.  
  7.         ; Получить размер файла
  8.         invoke  GetFileSize,ebx,NULL
  9.         mov     [file_size],eax
  10.  
  11.         ; Выделить память под файл
  12.         invoke  GetProcessHeap
  13.         mov     [hProcHeap],eax
  14.         invoke  HeapAlloc,[hProcHeap],0,[file_size]
  15.         mov     [hLock],eax
  16.  
  17.         ; Загрузить картинку в память
  18.         invoke  _lread,ebx,[hLock],[file_size]
  19.         invoke  _lclose,ebx
Тут ничего сложного, в куче выделяется блок памяти под размер файла картинки, затем в него считывается содержимое файла.

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

prev 01 ... 29 30 31 32 33 34 35 ... 68 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0024 сек.) / Память: 4.5 Mb
Наверх