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