49

System.Drawing.ImageさまざまなSystem.Windows.MessageBoxImage(s) および/または System.Windows.Forms.MessageBoxIcon(s)の を取得するにはどうすればよいですか

4

4 に答える 4

62

SystemIconsは私が探していたものです:

SystemIcons.Warning.ToBitmap();
于 2009-08-21T03:07:25.727 に答える
18

他の人が述べているよう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);
于 2014-08-21T15:10:52.977 に答える
-3
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

それと同じくらい簡単です。

于 2019-07-24T14:31:12.473 に答える