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

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

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

[DllImport("user32")]
public static extern UInt32 SendMessage(IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);

const int BCM_SETSHIELD = 0x160C; //Для отображения кнопки со щитом

//....где-то в коде
SendMessage(имя_кнопки.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF);
Описали функцию SendMessage, задали константу BCM_SETSHIELD и отправили сообщение используя указатель (Handle) на элемент управления.
Для тестирования я написал небольшое приложение, которое демонстрирует вышеописанный способ. В приложении я добавил пару методов:
1-й IsAdmin проверяет права текущего пользователя
2-й btnShield_Click запускает приложение с повышенными привилегиями.
Для запуска внешнего приложения с правами администратора достаточно в объекте ProcessStartInfo задать полю Verb значение «runas».
В принципе больше ничего сложного и необычного я не вижу.
Вот как это выглядит:

[DllImport("user32")]
public static extern UInt32 SendMessage
 (IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);

const int BCM_SETSHIELD = 0x160C; //Для отображения кнопки со щитом

public Form1()
{
 InitializeComponent();
}

/// 
/// Проверить, является ли пользователь администратором
/// 
/// 
static internal bool IsAdmin()
{
 WindowsIdentity id = WindowsIdentity.GetCurrent();
 WindowsPrincipal p = new WindowsPrincipal(id);
 return p.IsInRole(WindowsBuiltInRole.Administrator);
}

private void Form1_Load(object sender, EventArgs e)
{
 if (!IsAdmin())
 {
  btnShield.FlatStyle = FlatStyle.System;
  SendMessage(btnShield.Handle, BCM_SETSHIELD, 0, 0xFFFFFFFF);
 }           
}

private void btnShield_Click(object sender, EventArgs e)
{
 ProcessStartInfo startInfo = new ProcessStartInfo();
 startInfo.UseShellExecute = true;
 startInfo.WorkingDirectory = Environment.CurrentDirectory;
 startInfo.FileName = Application.ExecutablePath;
 startInfo.Verb = "runas";
 try
 {
  Process p = Process.Start(startInfo);
 }
 catch (System.ComponentModel.Win32Exception ex)
 {
  return;
 }

 Application.Exit();
}
Источник krez0n.org.ua


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!