• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Устанавливаем иконку UAC Shield на кнопку

Каждый, кто использует Windows Vista или Windows 7 видел такую вот иконку на различных элементах управления. Щит на элементе управления означает, что после взаимодействия с ним, у пользователя будут запрошены повышенные права доступа. Чаще всего так выглядят кнопки, хотя встречаются и другие элементы управления. Также, эта иконка указывает, что в системе включена UAC.

Что нужно сделать, чтобы добавить такую иконку на кнопку в своем приложении? В принципе ничего сложного в этом нет. Достаточно четырех строк кода. Принцип работы следующий:
вы, используя функцию SendMessage (из библиотеки WinAPI), отправляете кнопке сообщение BCM_SETSHIELD. Вот и все.

Смотрите код:

1 [DllImport("user32")]
2 public static extern UInt32 SendMessage(IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);
3  
4 const int BCM_SETSHIELD = 0x160C; //Для отображения кнопки со щитом
5  
6 ....где-то в коде
7 SendMessage(имя_кнопки.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF);

Описали функцию SendMessage, задали константу BCM_SETSHIELD и отправили сообщение используя указатель (Handle) на элемент управления.

Для тестирования я написал небольшое приложение, которое демонстрирует вышеописанный способ. В приложении я добавил пару методов:
1-й IsAdmin проверяет права текущего пользователя
2-й btnShield_Click запускает приложение с повышенными привилегиями.

Для запуска внешнего приложения с правами администратора достаточно в объекте ProcessStartInfo задать полю Verb значение «runas».

В принципе больше ничего сложного и необычного я не вижу.

Вот как это выглядит:

1 [DllImport("user32")]
2 public static extern UInt32 SendMessage
3     (IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);
4  
5 const int BCM_SETSHIELD = 0x160C; //Для отображения кнопки со щитом
6  
7 public Form1()
8 {
9     InitializeComponent();
10 }
11  
12 /// <summary>
13 /// Проверить, является ли пользователь администратором
14 /// </summary>
15 /// <returns></returns>
16 static internal bool IsAdmin()
17 {
18     WindowsIdentity id = WindowsIdentity.GetCurrent();
19     WindowsPrincipal p = new WindowsPrincipal(id);
20     return p.IsInRole(WindowsBuiltInRole.Administrator);
21 }
22  
23 private void Form1_Load(object sender, EventArgs e)
24 {
25     if (!IsAdmin())
26     {
27         btnShield.FlatStyle = FlatStyle.System;
28         SendMessage(btnShield.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF);
29     }
30 }
31  
32 private void btnShield_Click(object sender, EventArgs e)
33 {
34     ProcessStartInfo startInfo = new ProcessStartInfo();
35     startInfo.UseShellExecute = true;
36     startInfo.WorkingDirectory = Environment.CurrentDirectory;
37     startInfo.FileName = Application.ExecutablePath;
38     startInfo.Verb = "runas";
39     try
40     {
41         Process p = Process.Start(startInfo);
42     }
43     catch (System.ComponentModel.Win32Exception ex)
44     {
45         return;
46     }
47  
48     Application.Exit();
49 }