Hi,
Here is a quick example. Add a listview control to the form and
name it lv. Add an imagelist to form name it imlIcon.
Private Function getLocalIcons(ByVal szFolderPath As String)
Dim dirInfo As New System.IO.DirectoryInfo(szFolderPath)
Dim di As System.IO.DirectoryInfo
Dim fi As System.IO.FileInfo
Dim lvitem As ListViewItem
Dim hIcon As Icon
Dim cIcon As New clsGetIcon
Dim htIcons As New Hashtable
Dim intIndex As Integer
imlIcon.Images.Clear()
lv.Items.Clear()
lv.SmallImageList = imlIcon
For Each di In dirInfo.GetDirectories()
lvitem = lv.Items.Add(di.Name)
hIcon = cIcon.getIcon(di.FullName)
If htIcons.ContainsKey(hIcon) Then
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIcon.Images.Count - 1
End If
lvitem.ImageIndex = intIndex
Next
For Each fi In dirInfo.GetFiles()
lvitem = lv.Items.Add(fi.Name)
hIcon = cIcon.getIcon(fi.FullName)
If htIcons.ContainsKey(hIcon) Then
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIcon.Images.Count - 1
End If
lvitem.ImageIndex = intIndex
Next
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
lv.SuspendLayout()
getLocalIcons("C:\")
lv.ResumeLayout()
End Sub
The helper class.
Imports System.Runtime.InteropServices
Public Class clsGetIcon
Public Structure SHFILEINFO
Dim hIcon As IntPtr
Dim iIcon As Integer
Dim dwAttributes As Integer
<VBFixedString(260),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:=260)> Public szDisplayName As String
'String that contains the name of the file as it appears in the Microsoft®
Windows® Shell, or the path and file name of the file that contains the icon
representing the file.
<VBFixedString(80),
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:=80)> Public szTypeName As String
End Structure
Private Declare Auto Function SHGetFileInfo Lib "shell32" (ByVal pszPath As
String, _
ByVal dwFileAttributes As Integer, ByRef psfi As SHFILEINFO, _
ByVal cbFileInfo As Integer, ByVal uFlags As Integer) As Integer
Private Const SHGFI_ICON As Integer = &H100
Private Const SHGFI_SMALLICON As Integer = &H1 'Small icon
Private Const SHGFI_TYPENAME As Integer = &H400 ' get type name
Public Function getIcon(ByVal szFilename As String) As Icon
Try
Dim aSHFileInfo As New SHFILEINFO
Dim cbFileInfo As Integer = _
Marshal.SizeOf(aSHFileInfo)
Dim uflags As Integer = SHGFI_ICON Or SHGFI_SMALLICON
SHGetFileInfo(szFilename, 0, aSHFileInfo, cbFileInfo, uflags)
Dim myIcon As Icon
myIcon = Icon.FromHandle(aSHFileInfo.hIcon)
aSHFileInfo.szTypeName = Space(255)
SHGetFileInfo(szFilename, 0, aSHFileInfo, cbFileInfo, SHGFI_TYPENAME)
Trace.WriteLine(aSHFileInfo.szTypeName)
Return myIcon
Catch ex As Exception
Debug.WriteLine(ex.ToString)
Return Nothing
End Try
End Function
End Class
Ken
---------------------------
Need this:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName[MAX_PATH];
TCHAR szTypeName[80];
} SHFILEINFO
This is what I tried:
Public Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.LPStr, SizeConst:=Kernel.MAX_PATH)> Public
szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As String
End Structure
Kernel.MAX_PATH equals 260
But it doesn't appear to work. Does it look OK to you or do you know how to
fix it.
Thanks