API関数ExtractAssociatedIconを使用してアイコンハンドルを取得し、そこからIconオブジェクトを作成する。 ただ、この方法ではアルファチャンネルを含むアイコンは正しく取得できない(アルファ値を持つ部分が透過せず黒くなる)。

なお、.NET Framework 2.0以降ではIcon.ExtractAssociatedIconメソッドを用いることでファイル名から直接Iconオブジェクトを取得できるようになっている。

using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;

public class Form1 : System.Windows.Forms.Form
{

    // アプリケーションに関連づけられたアイコンを取得するためのAPI関数
    [DllImport( "shell32.dll", EntryPoint = "ExtractAssociatedIcon" )]
    private extern static IntPtr ExtractAssociatedIcon
        (
        IntPtr hInst,
        [MarshalAs(UnmanagedType.LPStr)] string lpIconPath,
        ref int lpiIcon
        );

    Icon ico;

    private void Form1_Load( object sender, System.EventArgs e )
    {
        string iconPath = "E:\\Test.exe";
        IntPtr hInst = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0] );
        Int32  iIcon = 0;
        IntPtr hIcon;

        // ファイルに関連付けられたアイコンのハンドルを取得する
        hIcon = ExtractAssociatedIcon( hInst, iconPath, ref iIcon );

        // アイコンハンドルからIconオブジェクトを作成する
        ico = Icon.FromHandle( hIcon );
    }

    private void Form1_Paint( object sender, System.Windows.Forms.PaintEventArgs e )
    {
        e.Graphics.DrawIcon( ico, 0, 0 );
    }
}