Быстрый поиск
Введите фрагмент названия статьи для поиска
Способы отправки сообщений в Windows
09.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Способы отправки сообщений в Windows
Любой разработчик программ под Windows наверняка так или иначе сталкивался с отправкой сообщений через функции SendMessage и PostMessage. При всей кажущейся простоте, у этих функций есть свои особенности, про которые будет полезно узнать, особенно начинающим программистам.
Читать статью целиком »
Просмотров: 2019 | Комментариев: 7
Приложение с постоянно активным окном
17.03.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
В Windows, когда окно становится активным или наоборот теряет фокус, меняется его визуальный стиль. В зависимости от выбранной темы, меняется цвет кнопок в заголовке, увеличивается или уменьшается тень от окна, да и сам заголовок тоже меняет цвет. А можно ли сделать так, чтобы окно не меняло визуальный стиль? Можно. Реализуется это таким несложным трюком. Когда окну надо поменять визуальный стиль в зависимости от активности, ему отправляется сообщение WM_NCACTIVATE с соответствующим параметром. Значит в наше приложение надо добавить обработку этого сообщения.Code (Assembler) : Убрать нумерацию
- ; (Де)активировать заголовок окна?
- cmp [msg],WM_NCACTIVATE
- je .activate_window
- ...
- ...
- ...
- .activate_window:
- ; Деактивировать?
- cmp [wparam],FALSE
- jne @f
- ; Оставить заголовок активным
- mov [wparam],TRUE
- @@:
- ; Отправить сообщение дальше
- invoke DefWindowProc,[hwnddlg],[msg],[wparam],[lparam]
- jmp .processed
Конечно, возникает логичный вопрос зачем это вообще все надо? Например, ваше приложение создает виджет или тулбар в виде окна, которое должно постоянно находиться на экране. Так вот, для таких окон как раз желательно применить этот трюк, чтобы они выглядели всегда одинаково, неважно, активен виджет или нет.
Читать статью целиком »
Просмотров: 992 | Комментариев: 0
Поле EDIT для ввода десятичных цифр
26.02.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как известно, если элементу диалогового окна типа EDIT установить флаг ES_NUMBER, то ввести в него можно будет только символы из интервала "0" - "9". Это в теории. На практике же в это поле через Ctrl+V или контекстное меню совершенно спокойно можно вставить любые данные, о чем даже написано в официальной документации. А еще в это поле нельзя ввести отрицательное число. Таким образом, практическая ценность ES_NUMBER приближается к нулю. Давайте учтем все эти недостатки и сделаем собственное, правильное поле EDIT для ввода десятичных цифр.Чтобы полностью контролировать ввод, надо будет воспользоваться субклассированием, заменив стандартную процедуру обработки на собственную. Это мы уже делали не раз, ничего нового тут нет.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- OldProc dd ? ; Адрес предыдущего обработчика
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Субклассирование на этапе инициализации окна
- invoke GetDlgItem,[hwnddlg],ID_SUB
- ; Установить наш собственный обработчик
- invoke SetWindowLong,eax,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- mov [OldProc],eax
- ...
Читать статью целиком »
Просмотров: 1183 | Комментариев: 13
Окно с возможностью клика сквозь него
15.11.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Окно с возможностью клика сквозь него
Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.
Читать статью целиком »
Просмотров: 1579 | Комментариев: 0
Как программно свернуть все окна
04.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Есть разные способы программно свернуть все открытые окна. Простой и топорный вариант решения - эмуляция нажатия клавиш Win+M, которые и выполняют команду "Свернуть все окна". Делается это через последовательность вызовов keybd_event.Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+Shift+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,KEYEVENTF_KEYUP,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Читать статью целиком »
Просмотров: 1749 | Комментариев: 5