Как добавить иконку щита UAC на кнопку
Начиная с Windows Vista, в интерфейсе системы на некоторых элементах управления появился значок в виде щита. Он означает, что при взаимодействии с таким элементом у пользователя будут запрошены повышенные права доступа. Если ваша программа выполняет действия, которые требуют повышенных прав, то хорошим тоном будет тоже отмечать специальной иконкой элементы управления, запускающие такие функции. Но совсем не обязательно таскать иконку в ресурсах или в каких-то отдельных файлах, тем более, что на разных системах она выглядит по-разному. Все делается очень просто, достаточно отправить нужной кнопке сообщение BCM_SETSHIELD и система сама дополнит кнопку иконкой щита, принятой в данной версии Windows. Если lParam сообщения равен TRUE, то иконка щита добавляется, а если FALSE, то, соответственно, удаляется.Code (Assembler) : Убрать нумерацию
- BCM_SETSHIELD = 0x160C
- ; Установить иконку на кнопку
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN1,BCM_SETSHIELD,0,TRUE
Code (Assembler) : Убрать нумерацию
- ; Какая-то иконка на кнопке уже есть?
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN1,BM_GETIMAGE,IMAGE_ICON,0
- or eax,eax
- jnz @f
- ; Иконки нет
- ...
- @@:
- ; Иконка есть
- ...
Code (Assembler) : Убрать нумерацию
- IDI_SHIELD = 0x7F06
- ; Загрузить иконку щита
- invoke GetSystemMetrics,SM_CXSMICON
- invoke LoadIconWithScaleDown,0,IDI_SHIELD,eax,eax,hShieldIcon
- ; [hShieldIcon] --> хэндл иконки щита
- ; Установить иконку на кнопку
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN2,BM_SETIMAGE,\
- IMAGE_ICON,[hShieldIcon]
- ; Установить иконку в заголовок окна
- invoke SendMessage,[hwnddlg],WM_SETICON,ICON_SMALL,[hShieldIcon]
- ; Установить иконку на STATIC
- invoke SendDlgItemMessage,[hwnddlg],ID_STAT,STM_SETIMAGE,\
- IMAGE_ICON,[hShieldIcon]
Также иконку щита можно добавить на элементы окон, открытых при помощи функции MessageBox, MessageBoxEx или MessageBoxIndirect. Для этого надо установить хук на создание окна, как рассказано в этой статье, а в обработчике выполнять различные действия с элементами окна сообщения.
Code (Assembler) : Убрать нумерацию
- ; Получить хэндл текущего потока
- invoke GetCurrentThreadId
- ; Установить перехватчик событий
- invoke SetWindowsHookEx,WH_CBT,MBHookProc,NULL,eax
- mov [hMBHook],eax
- ; Открыть MessageBox с кнопками Да/Нет
- mov [MsgBoxParams.cbSize],sizeof.MSGBOXPARAMS
- mov eax,[hwnddlg]
- mov [MsgBoxParams.hwndOwner],eax
- invoke GetModuleHandle,0
- mov [MsgBoxParams.hInstance],eax
- mov [MsgBoxParams.lpszText],szMess
- mov [MsgBoxParams.lpszCaption],szTitle
- mov [MsgBoxParams.dwStyle],MB_USERICON+MB_YESNO
- mov [MsgBoxParams.lpszIcon],0
- invoke MessageBoxIndirect,MsgBoxParams
- ; Снять перехватчик
- invoke UnhookWindowsHookEx,[hMBHook]
Code (Assembler) : Убрать нумерацию
- proc MBHookProc nCode:DWORD,wParam:DWORD,lParam:DWORD
- locals
- hIcon dd ?
- endl
- ; Сохранить все регистры
- pusha
- cmp [nCode],HCBT_ACTIVATE
- jne @f
- ; Установить иконку окна
- invoke SendMessage,[wParam],WM_SETICON,ICON_SMALL,[hShieldIcon]
- ; Установить иконку щита на кнопку Yes
- invoke SendDlgItemMessage,[wParam],IDYES,BCM_SETSHIELD,0,TRUE
- ; Загрузить иконку щита 32х32
- lea eax,[hIcon]
- invoke LoadIconWithScaleDown,0,IDI_SHIELD,32,32,eax
- ; Установить ее вместо пользовательской иконки
- invoke SendDlgItemMessage,[wParam],14h,STM_SETIMAGE,IMAGE_ICON,[hIcon]
- ; Восстановить регистры
- popa
- xor eax,eax
- ret
- @@:
- ; Восстановить регистры
- popa
- ; Передать управление следующему обработчику
- invoke CallNextHookEx,[hMBHook],[nCode],[wParam],[lParam]
- ret
- endp
Просмотров: 1255 | Комментариев: 1
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(11.12.2020 в 15:25):
Добавил информацию, как определить наличие иконки на кнопке. Архив обновлен.
Добавить комментарий
Заполните форму для добавления комментария