タグ:

実行ファイルからアプリケーションのアイコンを取得

example (VB.net)

Imports System.Runtime.InteropServices
SHGetFileInfo宣言部分
' SHGetFileInfo関数
Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" _
                               (ByVal pszPath As String, _
                                ByVal dwFileAttributes As Integer, _
                                ByRef psfi As SHFILEINFO, _
                                ByVal cbFileInfo As Integer, _
                                ByVal uFlags As Integer) As IntPtr

' SHGetFileInfo関数用の定数
Private Const SHGFI_ICON As Integer = &H100 ' アイコン・リソースの取得
Private Const SHGFI_LARGEICON As Integer = &H0 ' 大きいアイコン
Private Const SHGFI_SMALLICON As Integer = &H1 ' 小さいアイコン

' SHGetFileInfo関数用の構造体
Private Structure SHFILEINFO
  Public hIcon As IntPtr
  Public iIcon As IntPtr
  Public dwAttributes As Integer
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
  Public szDisplayName As String
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
  Public szTypeName As String
End Structure
'SHGetFileInfo宣言部分

Private Sub Form1_Load _
 (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles MyBase.Load
        
  Dim shinfo As New SHFILEINFO()

  For Each path As String In IO.Directory.GetFileSystemEntries("C:\")
    Dim key As String
    If IO.File.GetAttributes(path) = IO.FileAttributes.Directory Then
      key = "16"
    Else
      key = IO.Path.GetExtension(path)
    End If

    Dim ret As IntPtr = _
      SHGetFileInfo(path, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_LARGEICON)
    If ret.Equals(IntPtr.Zero) = False Then
      Dim appIcon As Icon = Icon.FromHandle(shinfo.hIcon)
      Me.ImageList1.Images.Add(key, appIcon)
    End If
  Next
End Sub

Private Sub Button1_Click _
 (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles Button1.Click
    For Each path As String In IO.Directory.GetFileSystemEntries("C:\")
      Dim key As String
      If IO.File.GetAttributes(path) = IO.FileAttributes.Directory Then
         key = "16"
      Else
         key = IO.Path.GetExtension(path)
      End If

      Dim subItem As New ListViewItem(IO.Path.GetFileName(path), key)
      ListView1.Items.Add(subItem)

    Next
  End Sub
End Class

実行ファイルからアプリケーションのアイコンを取得するには,win32APIのSHGetFileInfo関数を使用する必要があります。覚えるのも面倒なので、'SHGetFileInfo宣言部分にはさまれているコードをコピってください。 上のサンプルではフォームを読み込み時にイメージリストにアイコンを取得し、ボタンがクリックされたらリストビューにファイル名とアイコンを表示させています。