首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

為按鈕添加 UAC Shield 圖標:Windows 7 權限提升視覺提示

     編輯:關於.NET

Windows Vista/7 引入使用者帳戶控制 (UAC),需要管理員權限的操作應在按鈕上顯示盾牌圖標 (Shield Icon) 作為視覺提示。本文介紹透過 P/Invoke 呼叫 user32.dll 發送 BCM_SETSHIELD 訊息為現有按鈕添加盾牌的標準做法。

核心代碼

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public static class UacHelper {
    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    private const uint BCM_SETSHIELD = 0x0000160C; // 定義於 Commctrl.h

    /// <summary>
    /// 為按鈕啟用 UAC 盾牌圖標
    /// </summary>
    public static void EnableElevateIcon(Button button) {
        if (button == null) return;

        // 必須設為 System 樣式,否則自繪按鈕不顯示盾牌
        button.FlatStyle = FlatStyle.System;

        // 發送訊息:wParam=0, lParam=1 表示顯示盾牌
        SendMessage(new HandleRef(button, button.Handle), BCM_SETSHIELD, IntPtr.Zero, new IntPtr(1));
    }
}

使用示例

public partial class MainForm : Form {
    public MainForm() {
        InitializeComponent();
        UacHelper.EnableElevateIcon(btnAdminOperation); // 一鍵添加
    }

    private void btnAdminOperation_Click(object sender, EventArgs e) {
        // 實際提升權限需在 manifest 設定 requireAdministrator
        // 或使用 ProcessStartInfo.Verb = "runas"
        MessageBox.Show("執行需要管理員權限的操作...");
    }
}

效果展示

按鈕盾牌圖標

關鍵注意事項

  1. 僅為視覺提示:此圖標 不會 自動提升權限。實際提升需:
    - 應用程式 Manifest 設定 <requestedExecutionLevel level="requireAdministrator" /> (整個進程提升),或
    - 另行啟動進程:Process.Start(new ProcessStartInfo { Verb = "runas", FileName = "cmd.exe" })。
  2. FlatStyle.System 強制:自繪按鈕 (FlatStyle.Standard/Popup/Flat) 不支援系統盾牌渲染。
  3. WPF 對應做法:Button.SetValue(Shell.GetIsShieldPropertyKey(), true) (需引用 Microsoft.Windows.Shell 或手動 P/Invoke)。
  4. DPI 感知:高 DPI 下盾牌可能模糊,建議應用程式設定 dpiAware。

補充工具:icacls 權限查看

文中附帶 icacls.exe 下載 (Vista+ 內建),可查看檔案/目錄 ACL:

C:\Users> icacls c:\windows
c:\windows NT SERVICE\TrustedInstaller:(F)
           NT SERVICE\TrustedInstaller:(CI)(IO)(F)
           NT AUTHORITY\SYSTEM:(M)
           ...
Successfully processed 1 files; Failed processing 0 files

對應權限代碼:F=完全控制, M=修改, RX=讀取/執行, CI=容器繼承, IO=僅繼承, OI=物件繼承。

源碼下載

  • Windows 7 兼容性 Webcast Demo (含完整專案)
  • icacls 工具獨立下載

正確使用 UAC Shield 圖標,能讓使用者在點擊前預知權限提升,減少「為什麼彈 UAC 視窗」的困惑,是良好 Windows 應用體驗的細節之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved