' 發展單位:風禹科技驗證有限公司 ' 撰寫人:鄭子璉(Tzu-Lien, Cheng, 璉璉) ,成大水博肄,微軟最有價值專家 ' Web: http://tlcheng.twbbs.org/TLCheng/ E-Mail: qvb3377@ms5.hinet.net ' -------------------------------------------------------------------------------------- Module modIconTool #Region "API 宣告" Private Declare Auto Function ExtractAssociatedIcon Lib "shell32.dll" (ByVal hInst As Integer, ByVal lpIconPath As String, ByVal lpiIcon As Integer) As IntPtr 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 Integer Private Declare Auto Function DestroyIcon Lib "user32.dll" (ByVal hIcon As IntPtr) As Integer _ Private Function SHGetFileInfo( _ ByVal pszPath As String, _ ByVal dwFileAttributes As Integer, _ ByRef psfi As SHFILEINFO, _ ByVal cbFileInfo As Integer, _ ByVal uFlags As Integer _ ) As Integer End Function Private Structure SHFILEINFO Public hIcon As IntPtr ' : icon Public iIcon As Integer ' : icondex Public dwAttributes As Integer ' : SFGAO_ flags Public szDisplayName As String Public szTypeName As String End Structure Public Enum enuIconSizeIndex As Integer SHGFI_ICON = &H100 SHGFI_SMALLICON = &H1 SHGFI_LARGEICON = &H0 ' Large icon SHGFI_SYSICONINDEX = &H4000 SHGFI_ATTRIBUTES = &H800 SHGFI_DISPLAYNAME = &H200 SHGFI_EXETYPE = &H2000 SHGFI_ICONLOCATION = &H1000 SHGFI_LINKOVERLAY = &H8000 SHGFI_OPENICON = &H2 SHGFI_PIDL = &H8 SHGFI_SELECTED = &H10000 SHGFI_SHELLICONSIZE = &H4 SHGFI_TYPENAME = &H400 SHGFI_USEFILEATTRIBUTES = &H10 ' ListView LVSIL_NORMAL = 0 LVSIL_SMALL = 1 LVSIL_STATE = 2 ' ListView Column LVCF_FMT = &H1 LVCF_WIDTH = &H2 LVCF_TEXT = &H4 LVCF_SUBITEM = &H8 LVCF_IMAGE = &H10 LVCF_ORDER = &H20 LVCFMT_LEFT = &H0 LVCFMT_RIGHT = &H1 LVCFMT_CENTER = &H2 LVCFMT_JUSTIFYMASK = &H3 LVCFMT_IMAGE = &H800 LVCFMT_BITMAP_ON_RIGHT = &H1000 LVCFMT_COL_HAS_IMAGES = &H8000 TVSIL_NORMAL = 0 TVSIL_STATE = 2 End Enum #End Region Private Enum enuHandleIcon As Integer hIcon = 0 iIcon = 1 hImageList = 2 End Enum Public Function GetIconIamgeFromFile(ByVal strFile As String, Optional ByVal lpiIcon As Integer = 0, Optional ByVal nFlags As enuIconSizeIndex = enuIconSizeIndex.SHGFI_LARGEICON Or enuIconSizeIndex.SHGFI_USEFILEATTRIBUTES) As System.Drawing.Image Dim rImage As System.Drawing.Image = GetIconImageFromHandle(SHGetFileHIcon(strFile, lpiIcon, nFlags)) Return rImage End Function Public Function LoadIconIamgeFile(ByVal strFile As String) As System.Drawing.Image Dim rImage As System.Drawing.Image = New System.Drawing.Icon(strFile).ToBitmap() Return rImage End Function Public Function SHGetFileHIcon(ByVal strFile As String, Optional ByVal lpiIcon As Integer = 0, Optional ByVal nFlags As enuIconSizeIndex = enuIconSizeIndex.SHGFI_LARGEICON Or enuIconSizeIndex.SHGFI_USEFILEATTRIBUTES) As IntPtr nFlags = nFlags Or enuIconSizeIndex.SHGFI_ICON Return New IntPtr(SHGetFileIconHandle(strFile, lpiIcon, nFlags, enuHandleIcon.hIcon)) End Function Private Function SHGetFileIconHandle(ByVal strFile As String, Optional ByVal lpiIcon As Integer = 0, Optional ByVal nFlags As enuIconSizeIndex = enuIconSizeIndex.SHGFI_LARGEICON Or enuIconSizeIndex.SHGFI_USEFILEATTRIBUTES, Optional ByVal HandleIcon As enuHandleIcon = enuHandleIcon.hIcon) As Integer Dim shinfo As SHFILEINFO = New SHFILEINFO strFile &= Chr(0) shinfo.iIcon = lpiIcon shinfo.szDisplayName = New String(Chr(0), 260) shinfo.szTypeName = New String(Chr(0), 80) Dim hImageList As Integer = SHGetFileInfo(strFile, 0, shinfo, System.Runtime.InteropServices.Marshal.SizeOf(shinfo), nFlags) Select Case HandleIcon Case enuHandleIcon.hIcon Return shinfo.hIcon.ToInt32 Case enuHandleIcon.iIcon Return shinfo.iIcon Case enuHandleIcon.hImageList Return hImageList End Select End Function Public Function GetIconImageFromHandle(ByVal hIcon As System.IntPtr) As System.Drawing.Image Dim rImage As System.Drawing.Image Try rImage = System.Drawing.Icon.FromHandle(hIcon).ToBitmap() Catch rImage = Nothing End Try Return rImage End Function ' 傳回 hIcon Public Function myExtractAssociatedIcon(ByVal strFile As String, Optional ByVal lpiIcon As Integer = 0) As IntPtr Dim hInstance As Integer = MyGetHInstance() Return ExtractAssociatedIcon(hInstance, strFile, lpiIcon) End Function Private Function MyGetHInstance() As Integer Return System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32() End Function End Module