System.Drawing.Image
さまざまなSystem.Windows.MessageBoxImage
(s) および/または
System.Windows.Forms.MessageBoxIcon
(s)の を取得するにはどうすればよいですか
4 に答える
SystemIconsは私が探していたものです:
SystemIcons.Warning.ToBitmap();
他の人が述べているようSystemIcons
に、これらのアイコンを含むべきクラスですが、Windows 8.1 (およびおそらく以前のバージョンでも) に存在するアイコンは、アスタリスク、情報、および質問の場合にSystemIcons
表示されるものとは異なります。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);
MessageBox.Show(
"Hello, world!",
"My App",
MessageBoxButton.OK, MessageBoxImage.Information);
それと同じくらい簡単です。