Blog. Just Blog

Как добавить иконку щита UAC на кнопку

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Начиная с Windows Vista, в интерфейсе системы на некоторых элементах управления появился значок в виде щита. Он означает, что при взаимодействии с таким элементом у пользователя будут запрошены повышенные права доступа. Если ваша программа выполняет действия, которые требуют повышенных прав, то хорошим тоном будет тоже отмечать специальной иконкой элементы управления, запускающие такие функции. Но совсем не обязательно таскать иконку в ресурсах или в каких-то отдельных файлах, тем более, что на разных системах она выглядит по-разному. Все делается очень просто, достаточно отправить нужной кнопке сообщение BCM_SETSHIELD и система сама дополнит кнопку иконкой щита, принятой в данной версии Windows. Если lParam сообщения равен TRUE, то иконка щита добавляется, а если FALSE, то, соответственно, удаляется.
  1.         BCM_SETSHIELD = 0x160C
  2.  
  3.         ; Установить иконку на кнопку
  4.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN1,BCM_SETSHIELD,0,TRUE
К сожалению, узнать наличие иконки щита на кнопке невозможно, по крайней мере я такой информации нигде не нашел. Если планируется динамически добавлять и удалять иконку, то установленное состояние придется хранить где-то в вашей программе.

В официальной документации сказано, что единственными элементами управления, на которые таким образом можно навесить значок щита, являются кнопки и командные ссылки. Но никто не запрещает загрузить изображение щита как обычную иконку и затем использовать ее хэндл. Иконка загружается с небольшим подвыподвертом - через функцию LoadIconWithScaleDown. Загруженную иконку можно установить в заголовок окна, на STATIC, точно так же на кнопку или на любой другой элемент диалогового окна, который поддерживает отображение HICON.
  1.         IDI_SHIELD    = 0x7F06
  2.  
  3.         ; Загрузить иконку щита
  4.         invoke  GetSystemMetrics,SM_CXSMICON
  5.         invoke  LoadIconWithScaleDown,0,IDI_SHIELD,eax,eax,hShieldIcon
  6.         ; [hShieldIcon] --> хэндл иконки щита
  7.  
  8.         ; Установить иконку на кнопку
  9.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN2,BM_SETIMAGE,\
  10.                 IMAGE_ICON,[hShieldIcon]
  11.         ; Установить иконку в заголовок окна
  12.         invoke  SendMessage,[hwnddlg],WM_SETICON,ICON_SMALL,[hShieldIcon]
  13.         ; Установить иконку на STATIC
  14.         invoke  SendDlgItemMessage,[hwnddlg],ID_STAT,STM_SETIMAGE,\
  15.                 IMAGE_ICON,[hShieldIcon]
Важное замечание. Чтобы программа могла использовать сообщение BCM_SETSHIELD и функцию LoadIconWithScaleDown, она должна быть скомпилирована с манифестом, в котором заявлена поддержка динамической библиотеки comctl32.dll версии 6.

Также иконку щита можно добавить на элементы окон, открытых при помощи функции MessageBox, MessageBoxEx или MessageBoxIndirect. Для этого надо установить хук на создание окна, как рассказано в этой статье, а в обработчике выполнять различные действия с элементами окна сообщения.
  1.         ; Получить хэндл текущего потока
  2.         invoke  GetCurrentThreadId
  3.         ; Установить перехватчик событий
  4.         invoke  SetWindowsHookEx,WH_CBT,MBHookProc,NULL,eax
  5.         mov     [hMBHook],eax
  6.         ; Открыть MessageBox с кнопками Да/Нет
  7.         invoke  MessageBox,[hwnddlg],szMess,szTitle,MB_YESNO
  8.         ; Снять перехватчик
  9.         invoke  UnhookWindowsHookEx,[hMBHook]
Точно так же можно установить иконку щита в заголовок окна сообщения или добавить ее к одной или нескольким кнопкам, отправляя BCM_SETSHIELD по стандартным идентификаторам этих кнопок.
  1. proc MBHookProc nCode:DWORD,wParam:DWORD,lParam:DWORD
  2.         ; Сохранить все регистры
  3.         pusha
  4.  
  5.         cmp     [nCode],HCBT_ACTIVATE
  6.         jne     @f
  7.  
  8.         ; Установить иконку окна
  9.         invoke  SendMessage,[wParam],WM_SETICON,ICON_SMALL,[hShieldIcon]
  10.         ; Установить иконку щита на кнопку Yes
  11.         invoke  SendDlgItemMessage,[wParam],IDYES,BCM_SETSHIELD,0,TRUE
  12.  
  13.         ; Восстановить регистры
  14.         popa
  15.  
  16.         xor     eax,eax
  17.         ret
  18. @@:
  19.         ; Восстановить регистры
  20.         popa
  21.  
  22.         ; Передать управление следующему обработчику
  23.         invoke  CallNextHookEx,[hMBHook],[nCode],[wParam],[lParam]
  24.         ret
  25. endp
В приложении пример программы с исходным текстом, которая добавляет иконку щита UAC на кнопки и другие элементы диалогового окна.

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

Shield.Icon.Demo.zip (3,718 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 183 | Комментариев: 0

Метки: Assembler, иконки

Комментарии

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

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

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

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