如何获取各种MessageBoxImage或MessageBoxIcon(s)的图像?

我如何得到一个System.Drawing.Image各种System.Windows.MessageBoxImage和/或System.Windows.Forms.MessageBoxIcon(s)

SystemIcons是我正在寻找

例如

SystemIcons.Warning.ToBitmap(); 

您也可以在您的XAML中包含SystemIcons,如下所示:

在你的XAML中包含一个转换器(见下面的代码)作为一个资源和一个Image控件。 此图片样本显示信息图标。

  <Window.Resources> <Converters:SystemIconConverter x:Key="iconConverter"/> </Window.Resources> <Image Visibility="Visible" Margin="10,10,0,1" Stretch="Uniform" MaxHeight="25" VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Converter={StaticResource iconConverter}, ConverterParameter=Information}"/> 

这里是转换器的实现:

 using System; using System.Drawing; using System.Globalization; using System.Reflection; using System.Windows; using System.Windows.Data; using System.Windows.Interop; using System.Windows.Media.Imaging; namespace Converters { [ValueConversion(typeof(string), typeof(BitmapSource))] public class SystemIconConverter : IValueConverter { public object Convert(object value, Type type, object parameter, CultureInfo culture) { Icon icon = (Icon)typeof(SystemIcons).GetProperty(parameter.ToString(), BindingFlags.Public | BindingFlags.Static).GetValue(null, null); BitmapSource bs = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); return bs; } public object ConvertBack(object value, Type type, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } } 

正如其他人所说SystemIcons是应该包含这些图标的类,但在Windows 8.1(也可能在早期版本上), SystemIcons的图标与Asterisk,Information和Question中显示在MessageBoxes上的图标不同。 对话框中的图标看起来更平坦 。 请参阅 – 例如 – 问题图标:

问题图标

对话框中的图标是本机对话框图标,背景中窗体上最左侧的图标是从SystemIcons类检索到的图标。

有关如何从MessageBox中获取图标的各种方法和详细信息,请参阅此答案 ,但为了完整起见,在此仅包含一个简短摘要:

你应该使用SHGetStockIconInfo函数:

  SHSTOCKICONINFO sii = new SHSTOCKICONINFO(); sii.cbSize = (UInt32)Marshal.SizeOf(typeof(SHSTOCKICONINFO)); Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_INFO, SHGSI.SHGSI_ICON , ref sii)); pictureBox1.Image = Icon.FromHandle(sii.hIcon).ToBitmap(); 

请注意 :

如果这个函数在psii指向的SHSTOCKICONINFO结构的hIcon成员中返回一个图标句柄,那么当你不再需要的时候,你有责任使用DestroyIcon释放图标。

当然,为了这个工作,你将不得不定义一些枚举和结构:

 public enum SHSTOCKICONID : uint { //... SIID_INFO = 79, //... } [Flags] public enum SHGSI : uint { SHGSI_ICONLOCATION = 0, SHGSI_ICON = 0x000000100, SHGSI_SYSICONINDEX = 0x000004000, SHGSI_LINKOVERLAY = 0x000008000, SHGSI_SELECTED = 0x000010000, SHGSI_LARGEICON = 0x000000000, SHGSI_SMALLICON = 0x000000001, 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 = 260/*MAX_PATH*/)] public string szPath; } [DllImport("Shell32.dll", SetLastError = false)] public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);