Získání ikony souboru pomocí SHGetFileInfo
Přidáno: 20.9.2007
Kategorie: VB.NET - Komponenty
Autor: Tomáš Herceg
Nedávno se v diskusi řešilo, jak získat ikonu pro nějaký soubor. Dnes jsem to potřeboval také, proto tento kód uvádím zde. Je potřeba použít API funkci SHGetFileInfo, která vrací informace o souboru. Protože tato funkce není nativní v .NET frameworku, musí se nadeklarovat jako import z knihovny. Navíc potřebuje ještě nejaké konstanty.
Ukázkový příklad potřebuje na formuláři komponenty TreeView a ImageList. Vypíše všechny soubory a složky z kořenového adresáře disku C:.
Imports System.Runtime.InteropServices
Public Class Form1
Private Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
Private Declare Auto 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
Private Const SHGFI_ICON = &H100
Private Const SHGFI_SMALLICON = &H1
Private Const SHGFI_LARGEICON = &H0
Private Function GetFileIcon(ByVal f As String) As Icon
Dim shinfo As New SHFILEINFO()
SHGetFileInfo(f, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
Return System.Drawing.Icon.FromHandle(shinfo.hIcon)
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer = 0
For Each f As String In IO.Directory.GetDirectories("c:\")
ImageList1.Images.Add(GetFileIcon(f))
TreeView1.Nodes.Add("im" & i, IO.Path.GetFileName(f), i, i)
i += 1
Next
For Each f As String In IO.Directory.GetFiles("c:\")
ImageList1.Images.Add(GetFileIcon(f))
TreeView1.Nodes.Add("im" & i, IO.Path.GetFileName(f), i, i)
i += 1
Next
End Sub
End Class