Ответ Мэтью Феррейры подробно описывает, почему вам нужно перезапустить все приложение и что делать, когда его перезапустить, однако он не рассказал, как отобразить значок щита. Вот некоторый код, который я использую (я думаю, что я первоначально получил его от другого ответа где-то на этом сайте), который будет показывать значок щита только тогда, когда программа не повышена
/// <summary>
/// Is a button with the UAC shield
/// </summary>
public partial class ElevatedButton : Button
{
/// <summary>
/// The constructor to create the button with a UAC shield if necessary.
/// </summary>
public ElevatedButton()
{
FlatStyle = FlatStyle.System;
if (!IsElevated()) ShowShield();
}
[DllImport("user32.dll")]
private static extern IntPtr
SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private uint BCM_SETSHIELD = 0x0000160C;
private bool IsElevated()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
private void ShowShield()
{
IntPtr wParam = new IntPtr(0);
IntPtr lParam = new IntPtr(1);
SendMessage(new HandleRef(this, Handle), BCM_SETSHIELD, wParam, lParam);
}
}
Кнопка проверяет, когда она создается, находится ли она в административном контексте, а если нет, то рисует значок щита на кнопке.
Если вы хотите, чтобы в Windows использовали значок щита, - это хитрый трюк , который возвращает значок щита как Bitmap
объект.