Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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'овского описания, там состояния и координаты описаны шестиэлементными массивами, а я для удобства работы дал им осмысленные имена вместо числовых индексов. Сути это не меняет, размера структуры тоже.

Теперь переходим к коду. Тут ничего сложного, заполнили размер структуры, отправили сообщение окну, работаем с нужными полями структуры. В этом примере проверяется наличие и состояние кнопки Close в заголовке окна, если она есть и активна, то курсор устанавливается на ее центр.
  1.         ; Получить информацию о заголовке окна
  2.         mov     [tbinfo.cbSize],sizeof.TITLEBARINFOEX
  3.         invoke  SendMessage,[hwnddlg],WM_GETTITLEBARINFOEX,0,tbinfo
  4.  
  5.         ; Кнопка Close отображается?
  6.         test    [tbinfo.stateClose],STATE_SYSTEM_INVISIBLE\
  7.                 or STATE_SYSTEM_OFFSCREEN or STATE_SYSTEM_UNAVAILABLE
  8.         jnz     .processed
  9.  
  10.         ; Координаты центра кнопки
  11.         mov     eax,[tbinfo.rectClose.bottom]
  12.         sub     eax,[tbinfo.rectClose.top]
  13.         shr     eax,1
  14.         add     eax,[tbinfo.rectClose.top]
  15.         push    eax
  16.  
  17.         mov     eax,[tbinfo.rectClose.right]
  18.         sub     eax,[tbinfo.rectClose.left]
  19.         shr     eax,1
  20.         add     eax,[tbinfo.rectClose.left]
  21.         push    eax
  22.  
  23.         ; Установить курсор на центр кнопки
  24.         invoke  SetCursorPos
Где это можно использовать? Я встречал программу, которая отслеживала MessageBox'ы и сразу перемещала курсор на кнопку закрытия окна. Мелочь, а приятно. Также есть программы, которые добавляют в заголовок окна дополнительные кнопки, а для этого надо знать, с какой позиции их дорисовывать. Получив размер заголовка, количество видимых кнопок и их размеры, координаты рисования легко посчитать.

В приложении пример программы с исходным текстом, которая реализует пример из статьи.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Close.Button.Demo.zip (2,442 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1539 | Комментариев: 0

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0044 сек.) / Память: 4.5 Mb
Наверх