Справочник по C#

    Исходники по языку программирования CSharp

    Устанавливаем иконку UAC Shield на кнопку: Справочник по C#

    /
    /
    /
    34 Views


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

    Устанавливаем иконку UAC Shield на кнопку: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9