Быстрый поиск
Введите фрагмент названия статьи для поиска
Получение информации о заголовке окна
12.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Манипулировать кнопками в заголовке окна мы уже научились. А как узнать, какие кнопки отображаются в заголовке окна и в каком они состоянии? Конечно, можно пройтись по стилям, по меню, но правильнее будет воспользоваться следующей информацией. Мне кажется, она станет хорошим дополнением к статье об управлении кнопками в заголовке окна.Для получения подробной информации о заголовке окна ему отправляется сообщение WM_GETTITLEBARINFOEX. Если все прошло успешно, на выходе получается заполненная структура TITLEBARINFOEX, в которой содержится информация о позициях и состоянии кнопок в заголовке окна, а также о размере самого заголовка.
Сперва надо описать структуру TITLEBARINFOEX и несколько констант, так как FASM в базовой комплектации о них не знает. Скорее всего это потому, что сообщение WM_GETTITLEBARINFOEX поддерживается только в Windows Vista и выше.
Code (Assembler) : Убрать нумерацию
- struct TITLEBARINFOEX
- cbSize dd ?
- rcTitleBar RECT
- stateTitleBar dd ?
- sReserved1 dd ?
- stateMinimize dd ?
- stateMaximize dd ?
- stateHelp dd ?
- stateClose dd ?
- rReserved0 RECT
- rReserved1 RECT
- rectMinimize RECT
- rectMaximize RECT
- rectHelp RECT
- rectClose RECT
- ends
- WM_GETTITLEBARINFOEX = 0x033F
- STATE_SYSTEM_FOCUSABLE = 0x00100000
- STATE_SYSTEM_INVISIBLE = 0x00008000
- STATE_SYSTEM_OFFSCREEN = 0x00010000
- STATE_SYSTEM_UNAVAILABLE = 0x00000001
- STATE_SYSTEM_PRESSED = 0x00000008
Читать статью целиком »
Просмотров: 1385 | Комментариев: 0
Выпадающий список (Combobox) с динамическим поиском
17.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем усовершенствовать элемент Combobox. Создавать его мы научились, красивыми иконками снабдили, теперь давайте добавим полнотекстовый поиск по списку и фильтрацию. Справедливости ради стоит отметить, что зачаточный вариант поиска в комбобоксе все-таки присутствует. Если ввести какую-нибудь строку, а затем открыть выпадающий список, то курсор будет установлен на первом найденном пункте списка, который начинается с введенной строки. Я же хочу сделать так, чтобы в списке оставались только те пункты, в которых присутствует введенная строка, причем не только в начале, а вообще. Например, если я введу "Jo", то в списке должны остаться как "John Smith", так и "Patrick Joel".Изменения поля ввода будем отлавливать штатными средствами в обработчике комбобокса. Это должно быть уведомление CBN_EDITUPDATE. После этого сохраняем введенную строку в сухом прохладном месте, очищаем список, а затем заполняем его, но уже только теми пунктами, где присутствует введенная строка.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_COMMAND
- je wmcommand
- ...
- ...
- wmcommand:
- cmp [wparam], CBN_EDITUPDATE shl 16 + ID_LIST
- je combobox_filter
Читать статью целиком »
Просмотров: 1261 | Комментариев: 0
Как защитить приложение от снятия скриншота
17.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как защитить приложение от снятия скриншота
Про ценность информации в современном цифровом мире можно рассказывать долго, но я этого делать не буду. Только хочу упомянуть такую безобидную на первый взгляд штуку, как скриншот экрана. "Алло, техподдержка, у меня тут программа что-то пишет непонятно" - "Пришлите скриншот". Тык в PrintScreen, вставить в письмо, отправить. Знакомая ситуация? А то, что в это время на экране может быть служебная или вовсе конфиденциальная информация, и куда она пойдет дальше, об этом мало кто думает. Если данные, отображаемые в окнах приложения, даже случайно не должны быть переданы не по назначению, то разработчикам софта стоит об этом позаботиться. На скриншоте как раз пример скриншота окна с защитой от скриншота (извините). Само окно есть, но его содержимое не отображается.
Читать статью целиком »
Просмотров: 2859 | Комментариев: 12
Управление кнопками Minimize, Maximize, Help и Close в заголовке окна
15.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная развлекуха на Ассемблере. Сегодня мы будем всячески управлять стандартными кнопками в заголовке окна. Это могут быть Minimize, Maximize, Help и Close, для каждой из них свои правила. Для начала, чтобы в заголовке окна появились кнопки, оно должно быть создано со стилями WS_CAPTION и WS_SYSMENU, этого достаточно, чтобы появилась кнопка Close. Кнопки Minimize и Maximize появляются при добавлении в стили окна хотя бы одного значения WS_MAXIMIZEBOX или WS_MINIMIZEBOX, причем они неразрывны как Ленин и Партия, в любом случае появятся обе, а комбинацией стилей только регулируется их активность. Для появления кнопки Help в расширенном стиле окна должно присутствовать значение WS_EX_CONTEXTHELP, причем кнопки Minimize/Maximize и кнопка Help взаимоисключающие, одновременно в заголовке окна они присутствовать не могут. Почему так сделано - непонятно.С теорией закончили, переходим к практике. В различных ситуациях может понадобиться отключение или включение определенных кнопок в заголовке окна. Как несложно догадаться, состояния кнопок Minimize, Maximize и Help регулируются манипуляциями со стилями окна:
Code (Assembler) : Убрать нумерацию
- .enable_min:
- ; Активировать кнопку Minimize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- or eax,WS_MINIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .disable_min:
- ; Отключить кнопку Minimize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- and eax,not WS_MINIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .enable_max:
- ; Активировать кнопку Maximize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- or eax,WS_MAXIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Code (Assembler) : Убрать нумерацию
- .disable_max:
- ; Отключить кнопку Maximize
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- and eax,not WS_MAXIMIZEBOX
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,eax
Читать статью целиком »
Просмотров: 1796 | Комментариев: 0
Переключение окна в полноэкранный режим и обратно
14.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Смотрел тут очередную киношку на своем любимом плеере Light Alloy и впервые за много лет обратил внимание, как он переключается в полноэкранный режим, а затем обратно. Нет, про само переключение, естественно, я знал и использовал, просто внезапно захотелось сделать что-нибудь подобное для оконного приложения на не менее любимом Ассемблере.Вот обработчик переключения. Он будет двухпозиционный, то есть если окно уже находится в полноэкранном режиме, то вернет его к исходному виду, а иначе развернет на полный экран. Естественно, вы можете разделить его на два отдельных события или оставить только нужную часть, например, только переход в полноэкранный режим.
Code (Assembler) : Убрать нумерацию
- invoke GetWindowLong,[hwnddlg],GWL_STYLE
- ; EBX - текущий стиль окна
- mov ebx,eax
- test ebx,WS_OVERLAPPEDWINDOW
- jz .fullscreen_off
- .fullscreen_on:
- and ebx,not WS_OVERLAPPEDWINDOW
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,ebx
- invoke ShowWindow,[hwnddlg],SW_MAXIMIZE
- jmp .processed
- .fullscreen_off:
- or ebx,WS_OVERLAPPEDWINDOW
- invoke SetWindowLong,[hwnddlg],GWL_STYLE,ebx
- invoke ShowWindow,[hwnddlg],SW_RESTORE
- jmp .processed
Читать статью целиком »
Просмотров: 1240 | Комментариев: 0