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 );
    }
}
Imports System.Drawing
Imports System.Reflection
Imports System.Runtime.InteropServices


Public Class Form1
    Inherits System.Windows.Forms.Form

    ' アプリケーションに関連づけられたアイコンを取得するためのAPI関数
    <DllImport("shell32.dll", EntryPoint:="ExtractAssociatedIcon")> _
    Private Shared Function ExtractAssociatedIcon _
        ( _
         ByVal hInst As System.IntPtr, _
         <MarshalAs(UnmanagedType.LPStr)> ByVal lpIconPath As String, _
         ByRef lpiIcon As Integer _
        ) _
        As System.IntPtr
    End Function

    Dim ico As Icon

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim iconPath As String = "E:\Test.exe"
        Dim hInst As IntPtr = Marshal.GetHINSTANCE([Assembly].GetExecutingAssembly().GetModules()(0))
        Dim iIcon As Int32
        Dim hIcon As IntPtr

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

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

    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

        e.Graphics.DrawIcon(ico, 0, 0)

    End Sub

End Class