WPF 按鈕添加 UAC 盾牌圖標
本文經原作者授權以原創方式二次分享,歡迎轉載、分享。
WPF 按鈕添加 UAC 盾牌圖標
作者: zhaotianff - 趙嘉
原文鏈接[1]:https://www.cnblogs.com/zhaotianff/p/17662237.html
在上一篇[2]文章中,介紹了如何獲取系統Shell
的圖標。在C#中
調用SHGetStockIconInfo
即可獲取獲取圖標
1)定義SHGetStockIconInfo
函數用到的數據結構
public enum SHSTOCKICONID : uint
{
/// <summary>Document of a type with no associated application.</summary>
SIID_DOCNOASSOC = 0,
/// <summary>Document of a type with an associated application.</summary>
SIID_DOCASSOC = 1,
/// <summary>Generic application with no custom icon.</summary>
SIID_APPLICATION = 2,
/// <summary>Folder (generic, unspecified state).</summary>
SIID_FOLDER = 3,
/// <summary>Folder (open).</summary>
SIID_FOLDEROPEN = 4,
/// <summary>5.25-inch disk drive.</summary>
SIID_DRIVE525 = 5,
/// <summary>3.5-inch disk drive.</summary>
SIID_DRIVE35 = 6,
/// <summary>Removable drive.</summary>
SIID_DRIVEREMOVE = 7,
/// <summary>Fixed drive (hard disk).</summary>
SIID_DRIVEFIXED = 8,
/// <summary>Network drive (connected).</summary>
SIID_DRIVENET = 9,
/// <summary>Network drive (disconnected).</summary>
SIID_DRIVENETDISABLED = 10,
/// <summary>CD drive.</summary>
SIID_DRIVECD = 11,
/// <summary>RAM disk drive.</summary>
SIID_DRIVERAM = 12,
/// <summary>The entire network.</summary>
SIID_WORLD = 13,
/// <summary>A computer on the network.</summary>
SIID_SERVER = 15,
/// <summary>A local printer or print destination.</summary>
SIID_PRINTER = 16,
/// <summary>The Network virtual folder (FOLDERID_NetworkFolder/CSIDL_NETWORK).</summary>
SIID_MYNETWORK = 17,
/// <summary>The Search feature.</summary>
SIID_FIND = 22,
/// <summary>The Help and Support feature.</summary>
SIID_HELP = 23,
/// <summary>Overlay for a shared item.</summary>
SIID_SHARE = 28,
/// <summary>Overlay for a shortcut.</summary>
SIID_LINK = 29,
/// <summary>Overlay for items that are expected to be slow to access.</summary>
SIID_SLOWFILE = 30,
/// <summary>The Recycle Bin (empty).</summary>
SIID_RECYCLER = 31,
/// <summary>The Recycle Bin (not empty).</summary>
SIID_RECYCLERFULL = 32,
/// <summary>Audio CD media.</summary>
SIID_MEDIACDAUDIO = 40,
/// <summary>Security lock.</summary>
SIID_LOCK = 47,
/// <summary>A virtual folder that contains the results of a search.</summary>
SIID_AUTOLIST = 49,
/// <summary>A network printer.</summary>
SIID_PRINTERNET = 50,
/// <summary>A server shared on a network.</summary>
SIID_SERVERSHARE = 51,
/// <summary>A local fax printer.</summary>
SIID_PRINTERFAX = 52,
/// <summary>A network fax printer.</summary>
SIID_PRINTERFAXNET = 53,
/// <summary>A file that receives the output of a Print to file operation.</summary>
SIID_PRINTERFILE = 54,
/// <summary>A category that results from a Stack by command to organize the contents of a folder.</summary>
SIID_STACK = 55,
/// <summary>Super Video CD (SVCD) media.</summary>
SIID_MEDIASVCD = 56,
/// <summary>A folder that contains only subfolders as child items.</summary>
SIID_STUFFEDFOLDER = 57,
/// <summary>Unknown drive type.</summary>
SIID_DRIVEUNKNOWN = 58,
/// <summary>DVD drive.</summary>
SIID_DRIVEDVD = 59,
/// <summary>DVD media.</summary>
SIID_MEDIADVD = 60,
/// <summary>DVD-RAM media.</summary>
SIID_MEDIADVDRAM = 61,
/// <summary>DVD-RW media.</summary>
SIID_MEDIADVDRW = 62,
/// <summary>DVD-R media.</summary>
SIID_MEDIADVDR = 63,
/// <summary>DVD-ROM media.</summary>
SIID_MEDIADVDROM = 64,
/// <summary>CD+ (enhanced audio CD) media.</summary>
SIID_MEDIACDAUDIOPLUS = 65,
/// <summary>CD-RW media.</summary>
SIID_MEDIACDRW = 66,
/// <summary>CD-R media.</summary>
SIID_MEDIACDR = 67,
/// <summary>A writable CD in the process of being burned.</summary>
SIID_MEDIACDBURN = 68,
/// <summary>Blank writable CD media.</summary>
SIID_MEDIABLANKCD = 69,
/// <summary>CD-ROM media.</summary>
SIID_MEDIACDROM = 70,
/// <summary>An audio file.</summary>
SIID_AUDIOFILES = 71,
/// <summary>An image file.</summary>
SIID_IMAGEFILES = 72,
/// <summary>A video file.</summary>
SIID_VIDEOFILES = 73,
/// <summary>A mixed file.</summary>
SIID_MIXEDFILES = 74,
/// <summary>Folder back.</summary>
SIID_FOLDERBACK = 75,
/// <summary>Folder front.</summary>
SIID_FOLDERFRONT = 76,
/// <summary>Security shield. Use for UAC prompts only.</summary>
SIID_SHIELD = 77,
/// <summary>Warning.</summary>
SIID_WARNING = 78,
/// <summary>Informational.</summary>
SIID_INFO = 79,
/// <summary>Error.</summary>
SIID_ERROR = 80,
/// <summary>Key.</summary>
SIID_KEY = 81,
/// <summary>Software.</summary>
SIID_SOFTWARE = 82,
/// <summary>A UI item, such as a button, that issues a rename command.</summary>
SIID_RENAME = 83,
/// <summary>A UI item, such as a button, that issues a delete command.</summary>
SIID_DELETE = 84,
/// <summary>Audio DVD media.</summary>
SIID_MEDIAAUDIODVD = 85,
/// <summary>Movie DVD media.</summary>
SIID_MEDIAMOVIEDVD = 86,
/// <summary>Enhanced CD media.</summary>
SIID_MEDIAENHANCEDCD = 87,
/// <summary>Enhanced DVD media.</summary>
SIID_MEDIAENHANCEDDVD = 88,
/// <summary>High definition DVD media in the HD DVD format.</summary>
SIID_MEDIAHDDVD = 89,
/// <summary>High definition DVD media in the Blu-ray Disc? format.</summary>
SIID_MEDIABLURAY = 90,
/// <summary>Video CD (VCD) media.</summary>
SIID_MEDIAVCD = 91,
/// <summary>DVD+R media.</summary>
SIID_MEDIADVDPLUSR = 92,
/// <summary>DVD+RW media.</summary>
SIID_MEDIADVDPLUSRW = 93,
/// <summary>A desktop computer.</summary>
SIID_DESKTOPPC = 94,
/// <summary>A mobile computer (laptop).</summary>
SIID_MOBILEPC = 95,
/// <summary>The User Accounts Control Panel item.</summary>
SIID_USERS = 96,
/// <summary>Smart media.</summary>
SIID_MEDIASMARTMEDIA = 97,
/// <summary>CompactFlash media.</summary>
SIID_MEDIACOMPACTFLASH = 98,
/// <summary>A cell phone.</summary>
SIID_DEVICECELLPHONE = 99,
/// <summary>A digital camera.</summary>
SIID_DEVICECAMERA = 100,
/// <summary>A digital video camera.</summary>
SIID_DEVICEVIDEOCAMERA = 101,
/// <summary>An audio player.</summary>
SIID_DEVICEAUDIOPLAYER = 102,
/// <summary>Connect to network.</summary>
SIID_NETWORKCONNECT = 103,
/// <summary>The Network and Internet Control Panel item.</summary>
SIID_INTERNET = 104,
/// <summary>A compressed file with a .zip file name extension.</summary>
SIID_ZIPFILE = 105,
/// <summary>The Additional Options Control Panel item.</summary>
SIID_SETTINGS = 106,
/// <summary>High definition DVD drive (any type - HD DVD-ROM, HD DVD-R, HD-DVD-RAM) that uses the HD DVD format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_DRIVEHDDVD = 132,
/// <summary>High definition DVD drive (any type - BD-ROM, BD-R, BD-RE) that uses the Blu-ray Disc format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_DRIVEBD = 133,
/// <summary>High definition DVD-ROM media in the HD DVD-ROM format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIAHDDVDROM = 134,
/// <summary>High definition DVD-R media in the HD DVD-R format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIAHDDVDR = 135,
/// <summary>High definition DVD-RAM media in the HD DVD-RAM format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIAHDDVDRAM = 136,
/// <summary>High definition DVD-ROM media in the Blu-ray Disc BD-ROM format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIABDROM = 137,
/// <summary>High definition write-once media in the Blu-ray Disc BD-R format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIABDR = 138,
/// <summary>High definition read/write media in the Blu-ray Disc BD-RE format.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_MEDIABDRE = 139,
/// <summary>A cluster disk array.</summary>
/// <remarks>Windows Vista with SP1 and later.</remarks>
SIID_CLUSTEREDDRIVE = 140,
/// <summary>The highest valid value in the enumeration.</summary>
/// <remarks>Values over 160 are Windows 7-only icons.</remarks>
SIID_MAX_ICONS = 175
}
[Flags]
public enum SHGSI : uint
{
/// <summary>The szPath and iIcon members of the SHSTOCKICONINFO structure receive the path and icon index of the requested icon, in a format suitable for passing to the ExtractIcon function. The numerical value of this flag is zero, so you always get the icon location regardless of other flags.</summary>
SHGSI_ICONLOCATION = 0,
/// <summary>The hIcon member of the SHSTOCKICONINFO structure receives a handle to the specified icon.</summary>
SHGSI_ICON = 0x000000100,
/// <summary>The iSysImageImage member of the SHSTOCKICONINFO structure receives the index of the specified icon in the system imagelist.</summary>
SHGSI_SYSICONINDEX = 0x000004000,
/// <summary>Modifies the SHGSI_ICON value by causing the function to add the link overlay to the file's icon.</summary>
SHGSI_LINKOVERLAY = 0x000008000,
/// <summary>Modifies the SHGSI_ICON value by causing the function to blend the icon with the system highlight color.</summary>
SHGSI_SELECTED = 0x000010000,
/// <summary>Modifies the SHGSI_ICON value by causing the function to retrieve the large version of the icon, as specified by the SM_CXICON and SM_CYICON system metrics.</summary>
SHGSI_LARGEICON = 0x000000000,
/// <summary>Modifies the SHGSI_ICON value by causing the function to retrieve the small version of the icon, as specified by the SM_CXSMICON and SM_CYSMICON system metrics.</summary>
SHGSI_SMALLICON = 0x000000001,
/// <summary>Modifies the SHGSI_LARGEICON or SHGSI_SMALLICON values by causing the function to retrieve the Shell-sized icons rather than the sizes specified by the system metrics.</summary>
SHGSI_SHELLICONSIZE = 0x000000004
}
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHSTOCKICONINFO
{
public UInt32 cbSize;
public IntPtr hIcon;
public Int32 iSysIconIndex;
public Int32 iIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = UACIcon.MAX_PATH)]
public string szPath;
}
說明:
SHSTOCKICONID
這里實際只需要定義SIID_SHIELD
這一個值就行了,我這里全部貼出來了,以后需要用到的時候可以直接到這里復制了。
2)定義UACIcon
的類,在這個類里封裝獲取UAC
圖標的方法
public class UACIcon
{
public const int MAX_PATH = 260;
[DllImport("Shell32.dll", SetLastError = false)]
public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);
[DllImport("user32.dll", SetLastError = true)]
static extern bool DestroyIcon(IntPtr hIcon);
public static BitmapSource GetUACIcon()
{
BitmapSource shieldSource = ;
SHSTOCKICONINFO sii = new SHSTOCKICONINFO();
sii.cbSize = (UInt32)Marshal.SizeOf(typeof(SHSTOCKICONINFO));
Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_SHIELD,
SHGSI.SHGSI_ICON | SHGSI.SHGSI_LARGEICON,
ref sii));
shieldSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
sii.hIcon,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
DestroyIcon(sii.hIcon);
return shieldSource;
}
}
上面的代碼中包含了從句柄創建
WPF ImageSource
的代碼,如果對這一塊不了解的話,可以參考[3]
3)界面XAML
如下:
<Grid>
<Button Width="74" Height="28">
<Button.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image Stretch="Uniform" x:Name="img_Icon" Width="18" Height="18" HorizontalAlignment="Right"/>
<Label Content="確認" Grid.Column="1" HorizontalAlignment="Left"/>
</Grid>
</Button.Content>
</Button>
</Grid>
4)加載圖標
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.img_Icon.Source = UACIcon.GetUACIcon();
}
}
原文鏈接: https://www.cnblogs.com/zhaotianff/p/17662237.html
[2]上一篇: https://www.cnblogs.com/zhaotianff/p/17662167.html
[3]參考: https://learn.microsoft.com/en-us/dotnet/api/system.windows.interop.imaging.createbitmapsourcefromhicon?view=windowsdesktop-7.0
信公眾號:Dotnet9,網站:Dotnet9,問題或建議:請網站留言, 如果對您有所幫助:歡迎贊賞。
閱讀導航
本文介紹使用FluentWPF控件庫實現亞克力效果的窗體。
使用 .Net Core 3.1 創建名為 “AcrylicWindow” 的WPF模板項目,添加三個Nuget庫:MaterialDesignThemes、MaterialDesignColors和FluentWPF,其中亞克力效果是由FluentWPF控件庫實現的。
以下為三個庫具體版本:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FluentWPF" version="0.4.0" targetFramework="net461" />
<package id="MaterialDesignColors" version="1.1.2" targetFramework="net461" />
<package id="MaterialDesignThemes" version="2.4.1.1101" targetFramework="net461" />
</packages>
解決方案主要文件目錄組織結構:
文件【App.xaml】,在StartupUri中設置啟動的視圖【MainWindow.xaml】,并在【Application.Resources】節點增加MaterialDesignThemes和FluentWPF控件庫的樣式文件:
<Application x:Class="AcrylicWindow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- FluentWPF Controls -->
<ResourceDictionary Source="pack://application:,,,/FluentWPF;component/Styles/Controls.xaml" />
<!-- Material Design Controls-->
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
文件【MainWindow.xaml】,引入MaterialDesignThemes和FluentWPF控件庫的命名空間,源碼如下:
<Window x:Class="AcrylicWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:fw="clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF"
mc:Ignorable="d"
fw:AcrylicWindow.Enabled="True" fw:AcrylicWindow.AcrylicWindowStyle="None"
MouseDown="Window_MouseDown" FontSize="15" Height="600" Width="1080" WindowStyle="None" AllowsTransparency="True" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="350"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid fw:PointerTracker.Enabled="True" Background="#01FFFFFF">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Foreground="Black" Background="{x:Null}" BorderBrush="{x:Null}">
<materialDesign:PackIcon Kind="ArrowLeft"/>
</Button>
<TextBlock Text="Settings" FontSize="12" Margin="10" VerticalAlignment="Center"/>
</StackPanel>
<ListViewItem Padding="0">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Home" Margin="15"/>
<TextBlock Text="Home" VerticalAlignment="Center"/>
</StackPanel>
</ListViewItem>
<TextBlock Text="System" Margin="15" FontWeight="DemiBold"/>
<ListView FontSize="15">
<ListViewItem Padding="1">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Monitor" Margin="15"/>
<TextBlock Text="Video" VerticalAlignment="Center"/>
</StackPanel>
</ListViewItem>
<ListViewItem Padding="1">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="Headphones" Margin="15"/>
<TextBlock Text="Audio" VerticalAlignment="Center"/>
</StackPanel>
</ListViewItem>
<ListViewItem Padding="1">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="MessageOutline" Margin="15"/>
<TextBlock Text="Notifications" VerticalAlignment="Center"/>
</StackPanel>
</ListViewItem>
<ListViewItem Padding="1">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="BatteryOutline" Margin="15"/>
<TextBlock Text="Battery" VerticalAlignment="Center"/>
</StackPanel>
</ListViewItem>
</ListView>
</StackPanel>
</Grid>
<Grid Grid.Column="1" Background="White">
</Grid>
</Grid>
</Window>
關鍵點說一下:
后臺代碼【MainWindow.xaml.cs】實現鼠標左鍵拖動窗體功能:
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
DragMove();
}
文中代碼已經全部給出,可直接Copy代碼,按解決方案目錄組織代碼文件即可運行,另附原作者視頻及源碼【見3.本文參考】、站長成功編譯的Demo(點擊下載->AcrylicWindow)。
除非注明,文章均由 Dotnet9 整理發布,歡迎轉載。轉載請注明本文地址:https://dotnet9.com/7372.html
時間如流水,只能流去不流回!
點擊【閱讀原文】,本站還有更多技術類文章等著您哦,此刻順便為我點個“再看”可好?
天有個想法想驗證一下,但是感覺項目組web前臺,后臺這樣開發,再聯調效率有點低。
因此,想回歸到原始的windows窗口程序,簡單直接。
一直都很懷念當年的delphi,開發速度,尤其是開發界面速度不要太快!
delphi沒落了后,開始用VS,Visual studio,不是現在前端開發用的vs code。
下載了第三方的demo后,發現vs2022中,無法將一個按鈕等控件拖動到窗體上,這不扯嗎,找原因沒找到。
vs2022卸載了,裝vs2015,又發現安裝不是,老是找不到包,以前可不這樣,一路next就安裝下去了。難不成。。。
又回到vs2022,通過網絡安裝,安裝上來,再打開,居然可以了。。。以前按鈕,控件都是灰的,無法拖動上去。
都是界面控件可視化設計操作,怎么有點不一樣呢,沒有以前絲滑了。
一看,程序文件是XAML文件,打開一看,能看明白,是xml格式的控件描述。
直接用winforms多好,簡單(不粗暴)。
既然第一次遇到,那就徹底搞明白。
WPF(Windows Presentation Foundation)是由微軟開發的桌面應用程序框架,用于創建現代化、高度交互和具有視覺吸引力的用戶界面。它是 .NET Framework 的一部分,提供了一種基于 XAML(Extensible Application Markup Language)語言的聲明性編程模型,可以很容易地創建動態、靈活的用戶界面,并且可以與其他 .NET 技術無縫集成。WPF 還具有強大的數據綁定和可重用性,使開發人員可以更快地構建和維護應用程序。WPF 也支持硬件加速和高分辨率顯示,為用戶帶來更好的體驗。
WPF(Windows Presentation Foundation)和 WinForms(Windows Forms)都是用于創建 Windows 桌面應用程序的框架,但它們有一些重要的區別:
Extensible Application Markup Language (Extensible Application Markup Language, XAML) 是一種聲明性語言。 具體來講,XAML 可初始化對象和設置對象的屬性,使用一種可顯示多個對象間分層關系的語言結構,還使用了一種支持類型擴展的支持類型約定。
使用 WPF 時首先遇到的事情之一是 XAML。XAML 代表可擴展應用程序標記語言,一種基于 XML 的簡單的聲明性語言,是微軟用于描述 GUI 的 XML 變種。在之前的 GUI 框架如 WinForms 中,GUI 是用相同語言創建,例如 C# 或 VB.NET ,并且通常由設計者來維護。但是,通過 XAML,微軟使用了另一種方式。非常類似HTML,你現在能輕松編寫你的GUI。
通用 Windows 平臺 (UWP),可以生成適用于任何 Windows 設備(電腦、Xbox One、HoloLens 等等)的應用,然后將這些應用發布到 Store。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。