Каждый, кто использует 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
0.00 (0%) 0 votes










