Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Получение информации о заголовке окна

12.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Манипулировать кнопками в заголовке окна мы уже научились. А как узнать, какие кнопки отображаются в заголовке окна и в каком они состоянии? Конечно, можно пройтись по стилям, по меню, но правильнее будет воспользоваться следующей информацией. Мне кажется, она станет хорошим дополнением к статье об управлении кнопками в заголовке окна.

Для получения подробной информации о заголовке окна ему отправляется сообщение WM_GETTITLEBARINFOEX. Если все прошло успешно, на выходе получается заполненная структура TITLEBARINFOEX, в которой содержится информация о позициях и состоянии кнопок в заголовке окна, а также о размере самого заголовка.

Сперва надо описать структуру TITLEBARINFOEX и несколько констант, так как FASM в базовой комплектации о них не знает. Скорее всего это потому, что сообщение WM_GETTITLEBARINFOEX поддерживается только в Windows Vista и выше.
  1. struct TITLEBARINFOEX
  2.         cbSize        dd ?
  3.         rcTitleBar    RECT
  4.         stateTitleBar dd ?
  5.         sReserved1    dd ?
  6.         stateMinimize dd ?
  7.         stateMaximize dd ?
  8.         stateHelp     dd ?
  9.         stateClose    dd ?
  10.         rReserved0    RECT
  11.         rReserved1    RECT
  12.         rectMinimize  RECT
  13.         rectMaximize  RECT
  14.         rectHelp      RECT
  15.         rectClose     RECT
  16. ends
  17.  
  18. WM_GETTITLEBARINFOEX     = 0x033F
  19.  
  20. STATE_SYSTEM_FOCUSABLE   = 0x00100000
  21. STATE_SYSTEM_INVISIBLE   = 0x00008000
  22. STATE_SYSTEM_OFFSCREEN   = 0x00010000
  23. STATE_SYSTEM_UNAVAILABLE = 0x00000001
  24. STATE_SYSTEM_PRESSED     = 0x00000008
При описании TITLEBARINFOEX я немного отошел от MSDN'овского описания, там состояния и координаты описаны шестиэлементными массивами, а я для удобства работы дал им осмысленные имена вместо числовых индексов. Сути это не меняет, размера структуры тоже.

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

Выпадающий список (Combobox) с динамическим поиском

17.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем усовершенствовать элемент Combobox. Создавать его мы научились, красивыми иконками снабдили, теперь давайте добавим полнотекстовый поиск по списку и фильтрацию. Справедливости ради стоит отметить, что зачаточный вариант поиска в комбобоксе все-таки присутствует. Если ввести какую-нибудь строку, а затем открыть выпадающий список, то курсор будет установлен на первом найденном пункте списка, который начинается с введенной строки. Я же хочу сделать так, чтобы в списке оставались только те пункты, в которых присутствует введенная строка, причем не только в начале, а вообще. Например, если я введу "Jo", то в списке должны остаться как "John Smith", так и "Patrick Joel".

Изменения поля ввода будем отлавливать штатными средствами в обработчике комбобокса. Это должно быть уведомление CBN_EDITUPDATE. После этого сохраняем введенную строку в сухом прохладном месте, очищаем список, а затем заполняем его, но уже только теми пунктами, где присутствует введенная строка.
  1.         cmp     [msg],WM_COMMAND
  2.         je      wmcommand
  3.         ...
  4.         ...
  5. wmcommand:
  6.         cmp     [wparam], CBN_EDITUPDATE shl 16 + ID_LIST
  7.         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 регулируются манипуляциями со стилями окна:
  1. .enable_min:
  2.         ; Активировать кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_min:
  2.         ; Отключить кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .enable_max:
  2.         ; Активировать кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_max:
  2.         ; Отключить кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
Если уж делать совсем все правильно, то было бы неплохо при активации одной из кнопок Minimize или Maximize на всякий случай удалять из расширенного стиля окна взаимоисключающее значение WS_EX_CONTEXTHELP. Также имейте в виду, что при одновременном отключении обеих кнопок, они просто исчезнут.

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

Переключение окна в полноэкранный режим и обратно

14.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Смотрел тут очередную киношку на своем любимом плеере Light Alloy и впервые за много лет обратил внимание, как он переключается в полноэкранный режим, а затем обратно. Нет, про само переключение, естественно, я знал и использовал, просто внезапно захотелось сделать что-нибудь подобное для оконного приложения на не менее любимом Ассемблере.

Вот обработчик переключения. Он будет двухпозиционный, то есть если окно уже находится в полноэкранном режиме, то вернет его к исходному виду, а иначе развернет на полный экран. Естественно, вы можете разделить его на два отдельных события или оставить только нужную часть, например, только переход в полноэкранный режим.
  1.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  2.         ; EBX - текущий стиль окна
  3.         mov     ebx,eax
  4.         test    ebx,WS_OVERLAPPEDWINDOW
  5.         jz      .fullscreen_off
  6.  
  7. .fullscreen_on:
  8.         and     ebx,not WS_OVERLAPPEDWINDOW
  9.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,ebx
  10.         invoke  ShowWindow,[hwnddlg],SW_MAXIMIZE
  11.         jmp     .processed
  12.  
  13. .fullscreen_off:
  14.         or      ebx,WS_OVERLAPPEDWINDOW
  15.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,ebx
  16.         invoke  ShowWindow,[hwnddlg],SW_RESTORE
  17.         jmp     .processed
При наличии нескольких мониторов окно будет развернуто на том, где оно в текущий момент находится. За видимость панели задач переживать не надо. Когда система обнаружит приложение, которое переключилось в полноэкранный режим, то панель задач будет спрятана автоматически. Дополнительных операций для этого выполнять не надо.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 3 (0.0038 сек.) / Память: 4.5 Mb
Наверх