Zohran Posted March 25, 2012 Share Posted March 25, 2012 (edited) Displays Correct Icons up to the max. some extra features added. expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <APIConstants.au3> #include <File.au3> #include <WinAPIEx.au3> #include <GuiImageList.au3> #include <AutoItObject.au3> #include <GDIPlus.au3> Opt("GUIOnEventMode", 1) Global $FileList, $FolderList Global $iCX = 32, $iCY = 32 ;icon size Global $progressbar1, $attributes Global $Inputtext = "", $oldtip = "" Global $EnterKey ; gui accel key Global $FolderIconIndex = 1 Global $FileIconIndex = 1 Global $folderIconsDone = False Global $EnterPressed = False Global $DestroyImageList = False Global $ListViewPopulate = False Global $AddIconOverlay = False Global $hGraphics1, $hIcon, $hOverlay Global $ResourceFile, $overlayindex, $hPen Global $IShellItemImageFactoryIsInterfaceAvailable = False Global Const $tagICOHEADER = 'ushort Reserved;ushort Type;ushort Count' Global Const $tagICOENTRY = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;long Size;long Offset' Global Const $tagIHDR = 'dword Width;dword Height;byte BitDepth;byte ColorType;byte CompressionMethod;byte FilterMethod;byte InterlaceMethod' Global Const $sIID_IShellItemImageFactory = "{bcc18b79-ba16-442f-80c4-8a59c30c463b}" Global Const $dtagIShellItemImageFactory = $dtagIUnknown & "GetImage hresult(uint64;dword;ptr*);" $sIID_IShellFolder = "{000214E6-0000-0000-C000-000000000046}" Global Const $dtagIShellFolder = $dtagIUnknown & _ "ParseDisplayName hresult(hwnd;ptr;wstr;dword*;ptr*;dword*);" & _ "EnumObjects hresult(hwnd;dword;ptr*);" & _ "BindToObject hresult(ptr;ptr;ptr;ptr*);" & _ "BindToStorage hresult(ptr;ptr;ptr;ptr*);" & _ "CompareIDs hresult(lparam;ptr;ptr);" & _ "CreateViewObject hresult(hwnd;ptr;ptr*);" & _ "GetAttributesOf hresult(UINT;ptr;ulong*);" & _ "GetUIObjectOf hresult(hwnd;uint;ptr;ptr;uint*;ptr*);" & _ "GetDisplayNameOf hresult(ptr;uint;ptr);" & _ "SetNameOf hresult(hwnd;ptr;wstr;dword;ptr*);" Global Const $ltagIShellFolder = $ltagIUnknown & _ "ParseDisplayName;" & _ "EnumObjects;" & _ "BindToObject;" & _ "BindToStorage;" & _ "CompareIDs;" & _ "CreateViewObject;" & _ "GetAttributesOf;" & _ "GetUIObjectOf;" & _ "GetDisplayNameOf;" & _ "SetNameOf;" Global Const $sIID_IExtractImage = "{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}" Global Const $dtagIExtractImage = $dtagIUnknown & _ "GetLocation hresult(wstr;DWORD;DWORD*;ptr;dword;DWORD*);" & _ "Extract hresult(ptr*);" Global Const $ltagIExtractImage = $ltagIUnknown & _ "GetLocation;" & _ "Extract;" Global Const $IID_IShellItem = "{43826d1e-e718-42ee-bc55-a1e261c37bfe}" Global Const $dtagIShellItem = $dtagIUnknown & _ "BindToHandler hresult(ptr;ptr;ptr;ptr*);" & _ "GetParent hresult(ptr*);" & _ "GetDisplayName hresult(dword;ptr*);" & _ "GetAttributes hresult(dword;dword*);" & _ "Compare hresult(ptr;dword;int*);" Global Const $ltagIShellItem = $ltagIUnknown & _ "BindToHandler;" & _ "GetParent;" & _ "GetDisplayName;" & _ "GetAttributes;" & _ "Compare;" _AutoItObject_StartUp() If _WinAPI_GetVersion() >= '6.0' Then $ResourceFile = @SystemDir & 'imageres.dll' $overlayindex = 154 $noiconindex = 2 $noiconexeindex = -15 $IShellItemImageFactoryIsInterfaceAvailable = True Global Const $tIIDImgFact = _AutoItObject_CLSIDFromString($sIID_IShellItemImageFactory) Else $ResourceFile = @SystemDir & 'shell32.dll' $overlayindex = 29 $noiconindex = 0 $noiconexeindex = 2 EndIf $Form1_1 = GUICreate("Advanced Listview Icon Display", 801, 616, 192, 124, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX)) GUISetOnEvent($GUI_EVENT_CLOSE, "Form1_1Close") $ListView1 = GUICtrlCreateListView("", 8, 64, 785, 545, BitOR($LVS_ICON, $LVS_SHOWSELALWAYS)) _GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_LABELTIP)) $Progress1 = GUICtrlCreateProgress(648, 16, 145, 17) $Radio1 = GUICtrlCreateRadio("16x16 Icons", 16, 16, 90, 17) GUICtrlSetOnEvent($Radio1, "Radio1Click") $Radio2 = GUICtrlCreateRadio("32x32 Icons", 112, 16, 97, 17) GUICtrlSetOnEvent($Radio2, "Radio2Click") GUICtrlSetState($Radio2, 1) $Radio3 = GUICtrlCreateRadio("48x48 Icons", 212, 17, 105, 17) GUICtrlSetOnEvent($Radio3, "Radio3Click") $Radio4 = GUICtrlCreateRadio("64x64 Icons", 323, 17, 97, 17) GUICtrlSetOnEvent($Radio4, "Radio4Click") $Radio5 = GUICtrlCreateRadio("128x128 Icons", 427, 17, 89, 17) GUICtrlSetOnEvent($Radio5, "Radio5Click") $Radio6 = GUICtrlCreateRadio("256x256 Icons", 542, 17, 105, 17) GUICtrlSetOnEvent($Radio6, "Radio6Click") $Inputtext = @ComputerName $Input1 = GUICtrlCreateInput("", 100, 40, 693, 21) $Button1 = GUICtrlCreateButton("Go -->", 50, 40, 41, 21) GUICtrlSetOnEvent($Button1, "Button1Click") $Button2 = GUICtrlCreateButton("Up", 8, 40, 41, 21) GUICtrlSetOnEvent($Button2, "Button2Click") $EnterKey = GUICtrlCreateDummy() GUICtrlSetOnEvent($EnterKey, "_AccelKeys") Dim $AccelKeys[1][2] = [["{ENTER}", $EnterKey]] GUISetAccelerators($AccelKeys) GUICtrlSetState($Input1, $GUI_FOCUS) _GUICtrlListView_SetView($ListView1, 1) $lImage = _GUIImageList_Create($iCX, $iCY, 5, 3) ; by default 32 pixel icon imagelist _GUICtrlListView_SetImageList($ListView1, $lImage, 0) $lImage2 = _GUIImageList_Create($iCX, $iCY, 5, 3) ; by default 32 pixel icon imagelist,create a separate for drives _GUICtrlListView_SetImageList($ListView1, $lImage, 0) drives() Func drives() GUICtrlSetData($Input1, @ComputerName) _GUIImageList_Destroy($lImage2) $lImage2 = _GUIImageList_Create($iCX, $iCY, 5, 3) _GUICtrlListView_SetImageList($ListView1, $lImage2, 0) $drives = DriveGetDrive("ALL") For $x = 1 To $drives[0] Local $tSHFILEINFO = DllStructCreate($tagSHFILEINFO) _WinAPI_ShellGetFileInfo($drives[$x], 0x00001000, 0, $tSHFILEINFO) $hIcon = _WinAPI_ShellExtractIcon(DllStructGetData($tSHFILEINFO, 4), DllStructGetData($tSHFILEINFO, 2), $iCX, $iCX) _GUIImageList_ReplaceIcon($lImage2, -1, $hIcon) _WinAPI_DestroyIcon($hIcon) _GUICtrlListView_AddItem($ListView1, $drives[$x], $x - 1) Next EndFunc ;==>drives $hToolTip = _GUICtrlListView_GetToolTips($ListView1) ; Prevent from displaying original tooltip ,we will create our own _GUICtrlListView_SetToolTips($ListView1, $hToolTip) _GDIPlus_Startup() $hWnd = _WinAPI_GetDesktopWindow() $hDC = _WinAPI_GetDC($hWnd) $hGraphics1 = _GDIPlus_GraphicsCreateFromHDC($hDC) _WinAPI_ReleaseDC($hWnd, $hDC) $hPen = _GDIPlus_PenCreate(0xC6C6C6C6, 3) ;Used for creating a rectangle around icons GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState(@SW_SHOW) While 1 Sleep(1) _IconLoad() ; reason to call function in main loop so that our program remains responsive If $EnterPressed == True Then Button1Click() $EnterPressed = False EndIf If $ListViewPopulate == True Then ListViewPopulate($Inputtext) $ListViewPopulate = False EndIf If $DestroyImageList == True Then _GUIImageList_Destroy($lImage) $lImage = _GUIImageList_Create($iCX, $iCY, 5, 3) _GUICtrlListView_SetImageList($ListView1, $lImage, 0) $FolderIconIndex = 1 $FileIconIndex = 1 $folderIconsDone = False $DestroyImageList = False ExtractIconOverlay() EndIf ToolTipEx() WEnd Func _IsPressedBackSpace() Local $a_R = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", '0x08') Return BitAND($a_R[0], 0x8000) <> 0 EndFunc ;==>_IsPressedBackSpace Func Form1_1Close() _AutoItObject_Shutdown() _GDIPlus_PenDispose($hPen) _GDIPlus_Shutdown() Exit EndFunc ;==>Form1_1Close Func _AccelKeys() Switch @GUI_CtrlId Case $EnterKey $EnterPressed = True EndSwitch EndFunc ;==>_AccelKeys Func Button1Click() If FileExists(GUICtrlRead($Input1)) Then $Inputtext = GUICtrlRead($Input1) If (StringMid($Inputtext, StringLen($Inputtext), 1) = "") Then $Inputtext = StringTrimRight($Inputtext, 1) $filefolder = _GUICtrlListView_GetSelectedIndices($ListView1, True) If UBound($filefolder) > 1 And $EnterPressed == True Then $Inputtext = $Inputtext & "" & _GUICtrlListView_GetItemText($ListView1, $filefolder[1]) If Not StringInStr(FileGetAttrib($Inputtext), "D") Then Run(@ComSpec & " /c " & Chr(34) & '"' & $Inputtext & '"' & Chr(34), "", @SW_HIDE) Return EndIf EndIf GUICtrlSetData($Input1, $Inputtext) $ListViewPopulate = True Else $filefolder = _GUICtrlListView_GetSelectedIndices($ListView1, True) If UBound($filefolder) > 1 Then $Inputtext = _GUICtrlListView_GetItemText($ListView1, $filefolder[1]) GUICtrlSetData($Input1, $Inputtext) $ListViewPopulate = True EndIf EndIf EndFunc ;==>Button1Click Func Button2Click() If (StringMid($Inputtext, StringLen($Inputtext), 1) == "") Then $Inputtext = StringTrimRight($Inputtext, 1) $Inputtext = StringLeft($Inputtext, StringInStr($Inputtext, "", 0, -1) - 1) If FileExists($Inputtext) Then GUICtrlSetData($Input1, $Inputtext) $ListViewPopulate = True Else _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) $Inputtext = @ComputerName Drives() EndIf EndFunc ;==>Button2Click Func Radio1Click() ;16x16 If $iCX <> 16 Then $iCX = 16 $iCY = 16 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio1Click Func Radio2Click() ;32x32 If $iCX <> 32 Then $iCX = 32 $iCY = 32 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio2Click Func Radio3Click() ;48x48 If $iCX <> 48 Then $iCX = 48 $iCY = 48 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio3Click Func Radio4Click() ;64x64 If $iCX <> 64 Then $iCX = 64 $iCY = 64 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio4Click Func Radio5Click() ;128x128 If $iCX <> 128 Then $iCX = 128 $iCY = 128 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio5Click Func Radio6Click() ;256x256 If $iCX <> 256 Then $iCX = 256 $iCY = 256 If $Inputtext == @ComputerName Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) Drives() Else $DestroyImageList = True EndIf EndIf EndFunc ;==>Radio6Click Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR $hWndListView = ControlGetHandle($hWnd, "", $ListView1) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $NM_DBLCLK $filefolder = _GUICtrlListView_GetSelectedIndices($ListView1, True) If UBound($filefolder) > 1 Then $aitem = _GUICtrlListView_GetItemText($ListView1, $filefolder[1]) If FileExists($Inputtext & "" & $aitem) Then If StringInStr(FileGetAttrib($Inputtext & "" & $aitem), "D") Then $Inputtext = $Inputtext & "" & $aitem GUICtrlSetData($Input1, $Inputtext) $ListViewPopulate = True Else Run(@ComSpec & " /c " & Chr(34) & '"' & $Inputtext & "" & $aitem & '"' & Chr(34), "", @SW_HIDE) EndIf Else If $Inputtext == @ComputerName Then $Inputtext = _GUICtrlListView_GetItemText($ListView1, $filefolder[1]) GUICtrlSetData($Input1, $Inputtext) $ListViewPopulate = True EndIf EndIf EndIf Case $LVN_KEYDOWN If _IsPressedBackSpace() Then Button2Click() Sleep(50) EndIf EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func ListViewPopulate($path) _GUICtrlListView_BeginUpdate($ListView1) GUICtrlSetData($progressbar1, 0) _GUIImageList_Destroy($lImage) $lImage = _GUIImageList_Create($iCX, $iCY, 5, 3) _GUICtrlListView_SetImageList($ListView1, $lImage, 0) _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView1)) _FileFolderArray($path) ;create array of files and folders $Percentage = 100 / ((UBound($FileList) - 1) + (UBound($FolderList) - 1)) ; used for calculating percentage completion of populating listview Local $FolderImageListIconIndex = 0 For $Shaheen = 2 To 1 Step -1 If $Shaheen == 2 Then If UBound($FolderList) > 0 Then ; loop through folder array first For $i = 1 To UBound($FolderList) - 1 $fullpath = $path & "" & $FolderList[$i] _GUICtrlListView_AddItem($ListView1, $FolderList[$i], $FolderImageListIconIndex) $FolderImageListIconIndex += 1 GUICtrlSetData($Progress1, Int($Percentage * $i)) Next EndIf Else Local $FileImageListIconIndex = $FolderImageListIconIndex If UBound($FileList) > 0 Then ; loop through file array For $i = 1 To UBound($FileList) - 1 $ext = StringMid($FileList[$i], StringInStr($FileList[$i], '.', 0, -1)) $fullpath = $path & "" & $FileList[$i] _GUICtrlListView_AddItem($ListView1, $FileList[$i], $FileImageListIconIndex) $FileImageListIconIndex += 1 GUICtrlSetData($Progress1, Int($Percentage * ($i + $FolderList[0]))) Next EndIf EndIf Next _GUICtrlListView_EndUpdate($ListView1) ExtractIconoverlay() $FolderIconIndex = 1 $FileIconIndex = 1 $folderIconsDone = False EndFunc ;==>ListViewPopulate Func _FileFolderArray($sPath) ;Create Array of files and folders for future use Local $hSearch, $sFile, $asFileList[1], $asFolderList[1] $FileList = 0 $FolderList = 0 If Not FileExists($sPath) Then Return $hSearch = FileFindFirstFile($sPath & "" & "*.*") If $hSearch = -1 Then Return While 1 $sFile = FileFindNextFile($hSearch) If @error Then SetError(0) ExitLoop EndIf If StringInStr(FileGetAttrib($sPath & "" & $sFile), "D") == 0 Then $asFileList[0] += 1 If UBound($asFileList) <= $asFileList[0] Then ReDim $asFileList[UBound($asFileList) * 2] $asFileList[$asFileList[0]] = $sFile ContinueLoop Else $asFolderList[0] += 1 If UBound($asFolderList) <= $asFolderList[0] Then ReDim $asFolderList[UBound($asFolderList) * 2] $asFolderList[$asFolderList[0]] = $sFile EndIf WEnd FileClose($hSearch) ReDim $asFileList[$asFileList[0] + 1] ReDim $asFolderList[$asFolderList[0] + 1] $FileList = $asFileList $FolderList = $asFolderList $asFileList = 0 $asFolderList = 0 EndFunc ;==>_FileFolderArray Func _IconLoad() If $folderIconsDone == False Then If UBound($FolderList) > 0 Then If $FolderIconIndex > $FolderList[0] Then $folderIconsDone = True Return EndIf Local $location = $Inputtext & "" & $FolderList[$FolderIconIndex] $attributes = FileGetAttrib($location) Select Case $iCX == 32 Or $iCX == 16 IconsLoad_16_32($location) Case $iCX == 48 Or $iCX == 64 Or $iCX == 128 Or $iCX == 256 IconsLoadImageList($location, "Folder", "") EndSelect _GUICtrlListView_RedrawItems($ListView1, $FolderIconIndex - 1, $FolderIconIndex - 1) $FolderIconIndex += 1 Else $folderIconsDone = True EndIf EndIf If UBound($FileList) > 0 Then If $folderIconsDone == True Then If $FileIconIndex > $FileList[0] Then Return EndIf Local $location = $Inputtext & "" & $FileList[$FileIconIndex] $attributes = FileGetAttrib($location) Local $type = "File" $szExt = StringMid($FileList[$FileIconIndex], StringInStr($FileList[$FileIconIndex], '.', 0, -1)) If $szExt == ".lnk" Then $shcut = FileGetShortcut($location) If IsArray($shcut) Then If $shcut[0] <> "" Then $location = $shcut[0] EndIf If StringInStr(FileGetAttrib($location), "D") == 0 Then $szExt = StringMid($location, StringInStr($location, '.', 0, -1)) Else $type = "Folder" EndIf $AddIconOverlay = True If IsArray($shcut) Then If $shcut[0] == "" Then $AddIconOverlay = False EndIf Else $AddIconOverlay = False EndIf Select Case $iCX == 32 Or $iCX == 16 IconsLoad_16_32($location) Case $iCX == 48 Or $iCX == 64 Or $iCX == 128 Or $iCX == 256 IconsLoadImageList($location, $type, $szExt) EndSelect _GUICtrlListView_RedrawItems($ListView1, $FolderIconIndex + $FileIconIndex - 2, $FolderIconIndex + $FileIconIndex - 2) If $FileIconIndex == $FileList[0] Then $AddIconOverlay = False _ReduceMemory() EndIf $FileIconIndex += 1 EndIf EndIf EndFunc ;==>_IconLoad Func IconsLoadImageList($location, $type, $ext = "") If $type == "Folder" Then If $IShellItemImageFactoryIsInterfaceAvailable == False Then Local $tSHFILEINFO = DllStructCreate($tagSHFILEINFO) _WinAPI_ShellGetFileInfo($location, 0x00001000, 0, $tSHFILEINFO) $hIcon = _WinAPI_ShellExtractIcon(DllStructGetData($tSHFILEINFO, 4), DllStructGetData($tSHFILEINFO, 2), $iCX, $iCX) If $AddIconOverlay == True And $ext == ".lnk" Then $hIcon = AddIconOverlay($hIcon) If StringInStr($attributes, "H") Then $hIcon = _WinAPI_Create32BitHICON($hIcon) $hIcon = _WinAPI_AddIconTransparency($hIcon, 50) EndIf $iIndex = _GUIImageList_ReplaceIcon($lImage, -1, $hIcon) If $iIndex == -1 Then $hIcon = _WinAPI_ShellExtractIcon($ResourceFile, 3, $iCX, $iCX) If $AddIconOverlay == True And $ext == ".lnk" Then $hIcon = AddIconOverlay($hIcon) If StringInStr($attributes, "H") Then $hIcon = _WinAPI_Create32BitHICON($hIcon) $hIcon = _WinAPI_AddIconTransparency($hIcon, 50) EndIf _GUIImageList_ReplaceIcon($lImage, -1, $hIcon) EndIf _WinAPI_DestroyIcon($hIcon) Else If _IShellFolder_Extract_hBMP($location) == 0 Then ZIconPreviewXP($ext, $location) EndIf Else If $IShellItemImageFactoryIsInterfaceAvailable == False Then If FileIconPreviewXP($location) == 0 Then ZIconPreviewXP($ext, $location) Else If _IShellFolder_Extract_hBMP($location) == 0 Then ZIconPreviewXP($ext, $location) EndIf EndIf EndFunc ;==>IconsLoadImageList Func IconsLoad_16_32($location) Local $large = 0 If $iCX == 16 Then $large = 1 $hIcon = _WinAPI_ShellExtractAssociatedIcon($location, $large) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) If StringInStr($attributes, "H") Then $hIcon = _WinAPI_Create32BitHICON($hIcon) $hIcon = _WinAPI_AddIconTransparency($hIcon, 50) EndIf _GUIImageList_ReplaceIcon($lImage, -1, $hIcon) _WinAPI_DestroyIcon($hIcon) EndFunc ;==>IconsLoad_16_32 Func GlobalIcon($location, $ishell) $hIcon = _WinAPI_ShellExtractAssociatedIcon($location, 0) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) $Hbitmap = _CreateBitmapFromIconEx(0xF8F8F8, 32, 32, $hIcon) $hBmp = _IShellFolder_GetImage($Hbitmap, $ishell, $ishell) If Not StringInStr($attributes, "H") Then _GUIImageList_Add($lImage, $hBmp) Else Convert_Bitmpap_ToIcon_And_Add_Transparency($hBmp) EndIf _WinAPI_DestroyIcon($hIcon) _WinAPI_DeleteObject($Hbitmap) _WinAPI_DeleteObject($hBmp) EndFunc ;==>GlobalIcon Func ExtractIconOverlay() _WinAPI_DestroyIcon($hOverlay) $hOverlay = _WinAPI_ShellExtractIcon($ResourceFile, $overlayindex, $iCX, $iCX) EndFunc ;==>ExtractIconOverlay Func AddIconOverlay($hIcon) $hResult = _WinAPI_AddIconOverlay($hIcon, $hOverlay) Return $hResult EndFunc ;==>AddIconOverlay Func GetIconGroupInfo($iconfile, $iconindex, $iCX) $hInstance = _WinAPI_LoadLibraryEx($iconfile, $LOAD_LIBRARY_AS_DATAFILE) If Not $hInstance Then Return 0 If $iconindex < 0 Then $iconindex = -1 * $iconindex $hResource = _WinAPI_FindResource($hInstance, $RT_GROUP_ICON, $iconindex) If $hResource == 0 Then _WinAPI_FreeLibrary($hInstance) Return 0 EndIf $hData = _WinAPI_LoadResource($hInstance, $hResource) $pData = _WinAPI_LockResource($hData) $iIcon = _WinAPI_LookupIconIdFromDirectoryEx($pData, 1, $iCX, $iCX) $hResource = _WinAPI_FindResource($hInstance, $RT_ICON, $iIcon) $iSize = _WinAPI_SizeOfResource($hInstance, $hResource) $hData = _WinAPI_LoadResource($hInstance, $hResource) $pData = _WinAPI_LockResource($hData) $hIcon = _WinAPI_CreateIconFromResourceEx($pData, $iSize) ; Create icon from resource $tSize = _WinAPI_GetIconDimension($hIcon) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) $Hbitmap = _CreateBitmapFromIconEx(0xF8F8F8, DllStructGetData($tSize, 'X'), DllStructGetData($tSize, 'Y'), $hIcon) $hBmp = _IShellFolder_GetImage($Hbitmap, $iCX, $iCX) If Not StringInStr($attributes, "H") Then _GUIImageList_Add($lImage, $hBmp) Else Convert_Bitmpap_ToIcon_And_Add_Transparency($hBmp) EndIf _WinAPI_DestroyIcon($hIcon) _WinAPI_DeleteObject($Hbitmap) _WinAPI_DeleteObject($hBmp) _WinAPI_FreeLibrary($hInstance) Return 1 EndFunc ;==>GetIconGroupInfo Func DrawImage($location) $hBmp = _GDIPlus_BitmapCreateFromGraphics($iCX, $iCX, $hGraphics1) $hGraphics2 = _GDIPlus_ImageGetGraphicsContext($hBmp) $hImage = _GDIPlus_ImageLoadFromFile($location) $Width = _GDIPlus_ImageGetWidth($hImage) $Height = _GDIPlus_ImageGetHeight($hImage) $iRatio = $Width / $Height $h = $iCX / $iRatio If $h > $iCX Then $h = $iCX $y = 0 $w = $iCX * $iRatio $x = ($iCX - $w) / 2 Else $x = 0 $w = $iCX $y = ($iCX - $h) / 2 EndIf If $Width < $iCX And $Height < $iCX Then Local $aGS = _IShellFolder_GetScale($Width, $Height, $iCX) _GDIPlus_GraphicsDrawImageRect($hGraphics2, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3]) Else _GDIPlus_GraphicsDrawImageRect($hGraphics2, $hImage, $x, $y, $w, $h) EndIf $hHBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp) If StringInStr($attributes, "H") Then Convert_Bitmpap_ToIcon_And_Add_Transparency($hHBMP) Else _GUIImageList_Add($lImage, $hHBMP) EndIf _GDIPlus_BitmapDispose($hBmp) _GDIPlus_GraphicsDispose($hGraphics2) _GDIPlus_ImageDispose($hImage) _WinAPI_DeleteObject($hHBMP) EndFunc ;==>DrawImage Func _CreateBitmapFromIconEx($iBackground, $iWidth, $iHeight, $hIcon) ; by Yashied Local $hDC, $hBackDC, $hBackSv, $Hbitmap $hDC = _WinAPI_GetDC(0) $hBackDC = _WinAPI_CreateCompatibleDC($hDC) $Hbitmap = _WinAPI_CreateSolidBitmap(0, 0xFFFFFFFF, $iWidth, $iHeight) $hBackSv = _WinAPI_SelectObject($hBackDC, $Hbitmap) If Not @error Then _WinAPI_DrawIconEx($hBackDC, 0, 0, $hIcon, $iWidth, $iWidth, 0, 0, 3) EndIf _WinAPI_SelectObject($hBackDC, $hBackSv) _WinAPI_ReleaseDC(0, $hDC) _WinAPI_DeleteDC($hBackDC) Return $Hbitmap EndFunc ;==>_CreateBitmapFromIconEx Func _IShellFolder_Extract_hBMP($sFileName) Local $pImgFact, $h_IShellFolder_Bmp If 0 = _IShellFolder_SHCreateItemFromParsingName($sFileName, 0, DllStructGetPtr($tIIDImgFact), $pImgFact) And $pImgFact Then ; use IShellItemImageFactory interface Local $r[4] $o_AUObj_IImgFact = _AutoItObject_WrapperCreate($pImgFact, $dtagIShellItemImageFactory) If Not StringInStr($attributes, "D") Then $r = $o_AUObj_IImgFact.GetImage(_IShellFolder_MakeUINT64($iCX, $iCX), 8, 0) ; <==== _IShellFolder_MakeUINT64 added If Not $r[3] Then ; no thumbnail available OR target is folder $r = $o_AUObj_IImgFact.GetImage(_IShellFolder_MakeUINT64($iCX, $iCX), 0, 0) ; <==== _IShellFolder_MakeUINT64 added $h_IShellFolder_Bmp = $r[3] Else $h_IShellFolder_Bmp = _IShellFolder_GetImage($r[3], $iCX, $iCX) EndIf $o_AUObj_IImgFact = 0 Else Return 0 EndIf If StringInStr($attributes, "H") Then Convert_Bitmpap_ToIcon_And_Add_Transparency($h_IShellFolder_Bmp) Else _GUIImageList_Add($lImage, $h_IShellFolder_Bmp) EndIf _WinAPI_DeleteObject($h_IShellFolder_Bmp) Return 1 EndFunc ;==>_IShellFolder_Extract_hBMP Func Convert_Bitmpap_ToIcon_And_Add_Transparency($hBmp) $IndirectIcon = _WinAPI_CreateIconIndirect($hBmp, $hBmp) $IndirectIcon = _WinAPI_Create32BitHICON($IndirectIcon) $hIcon2 = _WinAPI_AddIconTransparency($IndirectIcon, 50) _GUIImageList_ReplaceIcon($lImage, -1, $hIcon2) _WinAPI_DestroyIcon($IndirectIcon) _WinAPI_DestroyIcon($hIcon2) EndFunc ;==>Convert_Bitmpap_ToIcon_And_Add_Transparency Func _IShellFolder_GetImage($hBmp_Source, $i_TargetWidth = 32, $i_TargetHeight = 32) ; by Yashied Local $tBMP = DllStructCreate($tagBITMAP) _WinAPI_GetObject($hBmp_Source, DllStructGetSize($tBMP), DllStructGetPtr($tBMP)) Local $iW = DllStructGetData($tBMP, "bmWidth"), $iH = Abs(DllStructGetData($tBMP, "bmHeight")) Local $aGS = _IShellFolder_GetScale($iW, $iH, $i_TargetWidth) $hDC = _WinAPI_GetDC(0) $hDestDC = _WinAPI_CreateCompatibleDC($hDC) $hBmp = _WinAPI_CreateCompatibleBitmapEx($hDC, $i_TargetWidth, $i_TargetHeight, 0xFFFFFFFF) $hDestSv = _WinAPI_SelectObject($hDestDC, $hBmp) $hSrcDC = _WinAPI_CreateCompatibleDC($hDC) $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBmp_Source) If _WinAPI_IsAlphaBitmap($hBmp_Source) Then $result = _WinAPI_AlphaBlend($hDestDC, $aGS[0], $aGS[1], $aGS[2], $aGS[3], $hSrcDC, 0, 0, $iW, $iH, 255, 1) Else $result = _WinAPI_AlphaBlend($hDestDC, $aGS[0], $aGS[1], $aGS[2], $aGS[3], $hSrcDC, 0, 0, $iW, $iH, 255, 0) EndIf If $IShellItemImageFactoryIsInterfaceAvailable == False Then If $iCX > 64 Then If $iW < $iCX Then $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBmp) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2) _GDIPlus_GraphicsDrawRect($hGraphic, 2, 2, $iCX - 4, $iCX - 4, $hPen) $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage2) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_BitmapDispose($hImage2) EndIf EndIf EndIf _WinAPI_ReleaseDC(0, $hDC) _WinAPI_SelectObject($hDestDC, $hDestSv) _WinAPI_SelectObject($hSrcDC, $hSrcSv) _WinAPI_DeleteDC($hDestDC) _WinAPI_DeleteDC($hSrcDC) Return $hBmp EndFunc ;==>_IShellFolder_GetImage Func _IShellFolder_GetScale($iW, $iH, $i_TargetWidth) Local $aRet[4] If $iW <= $i_TargetWidth And $iH <= $i_TargetWidth Then $aRet[2] = $iW $aRet[3] = $iH $aRet[0] = ($i_TargetWidth - $aRet[2]) / 2 $aRet[1] = ($i_TargetWidth - $aRet[3]) / 2 ElseIf $iW > $iH Then $aRet[2] = $i_TargetWidth $aRet[3] = $iH / ($iW / $i_TargetWidth) $aRet[0] = 0 $aRet[1] = ($i_TargetWidth - $aRet[3]) / 2 ElseIf $iW < $iH Then $aRet[2] = $iW / ($iH / $i_TargetWidth) $aRet[3] = $i_TargetWidth $aRet[0] = ($i_TargetWidth - $aRet[2]) / 2 $aRet[1] = 0 ElseIf $iW = $iH Then $aRet[2] = $i_TargetWidth $aRet[3] = $i_TargetWidth $aRet[0] = 0 $aRet[1] = 0 EndIf Return $aRet EndFunc ;==>_IShellFolder_GetScale Func DrawIcon($sFile) $iSize = FileGetSize($sFile) $tData = DllStructCreate('byte[' & $iSize & ']') $pData = DllStructGetPtr($tData) $hFile = _WinAPI_CreateFile($sFile, 2, 2, 6) _WinAPI_ReadFile($hFile, $pData, $iSize, $iSize) _WinAPI_CloseHandle($hFile) $tHdr = DllStructCreate($tagICOHEADER, $pData) $Count = DllStructGetData($tHdr, 'Count') Dim $arrayico[$Count + 1] For $i = 1 To $Count ; this part by yashied $tEntry = DllStructCreate($tagICOENTRY, $pData + 6 + 16 * ($i - 1)) $pIcon = $pData + DllStructGetData($tEntry, 'Offset') $Offset = DllStructGetData($tEntry, 'Offset') If DllStructGetData(DllStructCreate('byte[8]', $pIcon), 1) = Binary('0x89504E470D0A1A0A') Then ; PNG => Retrieve IHDR chunk data (always first chunk, offset = 8) $tHdr = DllStructCreate($tagIHDR, $pIcon + 16) $Width = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Width')) $Height = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Height')) $Png = ' (PNG)' Else ; ICO => Retrieve BITMAPINFOHEADER structure $tHdr = DllStructCreate($tagBITMAPINFOHEADER, $pIcon) $Width = DllStructGetData($tHdr, 'biWidth') $Height = DllStructGetData($tHdr, 'biHeight') / 2 $Png = '' EndIf If $Width == $iCX And $Height == $iCX Then $hIcon = _WinAPI_ShellExtractIcon($sFile, 0, $Width, $Width) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) If StringInStr($attributes, "H") Then $hIcon = _WinAPI_Create32BitHICON($hIcon) $hIcon = _WinAPI_AddIconTransparency($hIcon, 50) EndIf _GUIImageList_ReplaceIcon($lImage, -1, $hIcon) _WinAPI_DestroyIcon($hIcon) Return EndIf $arrayico[$i] = $Width Next _ArraySort($arrayico) Local $aNewArray = _ArrayUnique($arrayico) For $z = (UBound($aNewArray) - 1) To 1 Step -1 If $aNewArray[$z] >= $iCX Then $iIndex = _WinAPI_LookupIconIdFromDirectoryEx($pData, 1, $iCX, $iCX) $hIcon = _WinAPI_ShellExtractIcon($sFile, -1 * $iIndex, $iCX, $iCX) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) If StringInStr($attributes, "H") Then $hIcon = _WinAPI_Create32BitHICON($hIcon) $hIcon = _WinAPI_AddIconTransparency($hIcon, 50) EndIf _GUIImageList_ReplaceIcon($lImage, -1, $hIcon) _WinAPI_DestroyIcon($hIcon) Return EndIf Next For $y = (UBound($aNewArray) - 1) To 1 Step -1 If $aNewArray[$y] <= $iCX Then $hIcon = _WinAPI_ShellExtractIcon($sFile, 0, $aNewArray[$y], $aNewArray[$y]) If $AddIconOverlay == True Then $hIcon = AddIconOverlay($hIcon) $Hbitmap = _CreateBitmapFromIconEx(0xF8F8F8, $aNewArray[$y], $aNewArray[$y], $hIcon) $hBmp = _IShellFolder_GetImage($Hbitmap, $iCX, $iCX) If Not StringInStr($attributes, "H") Then _GUIImageList_Add($lImage, $hBmp) Else Convert_Bitmpap_ToIcon_And_Add_Transparency($hBmp) EndIf _WinAPI_DestroyIcon($hIcon) _WinAPI_DeleteObject($Hbitmap) _WinAPI_DeleteObject($hBmp) Return EndIf Next EndFunc ;==>DrawIcon Func FileIconPreviewXP($location) $pidl = _IShellFolder_ILCreateFromPath($location) Dim $pIShellFolder, $pRelative $tRIID = _AutoItObject_CLSIDFromString($sIID_IShellFolder) $tRIIDExtract = _AutoItObject_CLSIDFromString($sIID_IExtractImage) _SHBindToParent($pidl, DllStructGetPtr($tRIID), $pIShellFolder, $pRelative) $IShellFolder = _AutoItObject_WrapperCreate($pIShellFolder, $dtagIShellFolder) $tSTRRET = DllStructCreate("uint uType;ptr data;") If IsObj($IShellFolder) Then $r = $IShellFolder.GetDisplayNameOf(Number($pRelative), 0, Number(DllStructGetPtr($tSTRRET))) Else Return 0 EndIf Dim $name _IShellFolder_StrRetToBuf(DllStructGetPtr($tSTRRET), 0, $name, 512) $tSTRRET = 0 $tArray = DllStructCreate("ptr") DllStructSetData($tArray, 1, $pRelative) $r = $IShellFolder.GetUIObjectOf(0, 1, Number(DllStructGetPtr($tArray)), Number(DllStructGetPtr($tRIIDExtract)), 0, 0) $IExtractImage = _AutoItObject_WrapperCreate($r[6], $dtagIExtractImage) If Not IsObj($IExtractImage) Then Return 0 Else $tSize = DllStructCreate("long;long") DllStructSetData($tSize, 1, $iCX) DllStructSetData($tSize, 2, $iCX) $r = $IExtractImage.GetLocation("", 1024, 0, Number(DllStructGetPtr($tSize)), 32, 0x0020 + 0x0200) ;IEIFLAG_SCREEN + IEIFLAG_QUALITY $r = $IExtractImage.Extract(0) $IShellFolder = 0 _IShellFolder_CoTaskMemFree($pidl) $IExtractImage = 0 $hBmp = _IShellFolder_GetImage($r[1], $iCX, $iCX) If Not StringInStr($attributes, "H") Then _GUIImageList_Add($lImage, $r[1]) Else Convert_Bitmpap_ToIcon_And_Add_Transparency($hBmp) EndIf EndIf _WinAPI_DeleteObject($r[1]) _WinAPI_DeleteObject($hBmp) Return 1 EndFunc ;==>FileIconPreviewXP Func ZIconPreviewXP($ext, $location) If $ext <> "" Then Select Case $ext = ".exe" $Data = _WinAPI_EnumResourceNames($location, $RT_GROUP_ICON) If UBound($Data) > 1 Then If GetIconGroupInfo($location, $Data[1], $iCX) == 0 Then GetIconGroupInfo($ResourceFile, $noiconexeindex + 1, $iCX) Else GetIconGroupInfo($ResourceFile, $noiconexeindex + 1, $iCX) EndIf Case $ext = ".ani" Or $ext = ".cur" GlobalIcon($location, $iCX) Case $ext = ".ico" DrawIcon($location) Case Else If $ext = ".bmp" Or $ext = ".jpg" Or $ext = ".jpeg" Or $ext = ".png" Or $ext = ".gif" Or $ext = ".bmp" Or $ext = ".tif" Or $ext = ".tiff" Or $ext = ".exif" Then If $iCX == 64 Or $iCX == 128 Or $iCX == 256 Then DrawImage($location) Return EndIf EndIf $iconlocation = _WinAPI_AssocQueryString($ext, $ASSOCSTR_DEFAULTICON) $iconlocation = StringSplit($iconlocation, ",") If UBound($iconlocation) > 1 Then $ExpandedPath = _ExpandEnvStrings($iconlocation[1]) If StringRight($ExpandedPath, 1) == '"' And StringLeft($ExpandedPath, 1) == '"' Then $ExpandedPath = StringTrimRight($ExpandedPath, 1) $ExpandedPath = StringTrimLeft($ExpandedPath, 1) $ExpandedPath = FileGetLongName($ExpandedPath) EndIf $extension = StringMid($ExpandedPath, StringInStr($ExpandedPath, '.', 0, -1)) EndIf If UBound($iconlocation) > 2 Then If $extension == ".ico" Then DrawIcon($ExpandedPath) Return EndIf If $extension == ".exe" Or $extension == ".EXE" Or $extension == ".dll" Then $Data = _WinAPI_EnumResourceNames($ExpandedPath, $RT_GROUP_ICON) If $iconlocation[2] >= 0 Then $iconlocation[2] = $Data[$iconlocation[2] + 1] EndIf If GetIconGroupInfo($ExpandedPath, $iconlocation[2], $iCX) == 0 Then GetIconGroupInfo($ResourceFile, $noiconindex + 1, $iCX) EndIf Else ; else ther is no index then maybe its a .ico file If $extension == ".ico" Then If UBound($iconlocation) > 1 Then DrawIcon($ExpandedPath) Else GlobalIcon($location, $iCX) EndIf Else GlobalIcon($location, $iCX) EndIf EndIf EndSelect Else GlobalIcon($location, $iCX) EndIf EndFunc ;==>ZIconPreviewXP Func _IShellFolder_MakeUINT64($long1, $long2) Local $d = DllStructCreate("align 4;dword[2]") DllStructSetData($d, 1, $long1, 1) DllStructSetData($d, 1, $long2, 2) Return DllStructGetData(DllStructCreate("uint64", DllStructGetPtr($d)), 1) EndFunc ;==>_IShellFolder_MakeUINT64 Func _IShellFolder_CoTaskMemFree($pMem) Local $aRes = DllCall("Ole32.dll", "none", "CoTaskMemFree", "ptr", $pMem) If @error Then SetError(1) EndFunc ;==>_IShellFolder_CoTaskMemFree Func _IShellFolder_ILCreateFromPath($sPath) Local $aRes = DllCall("shell32.dll", "ptr", "ILCreateFromPathW", "wstr", $sPath) If @error Then Return SetError(1, 0, 0) Return $aRes[0] EndFunc ;==>_IShellFolder_ILCreateFromPath Func _IShellFolder_SHCreateItemFromParsingName($szPath, $pbc, $riid, ByRef $pv) Local $aRes = DllCall("shell32.dll", "long", "SHCreateItemFromParsingName", "wstr", $szPath, "ptr", $pbc, "ptr", $riid, "ptr*", 0) If @error Then Return SetError(1, 0, 0) $pv = $aRes[4] Return $aRes[0] EndFunc ;==>_IShellFolder_SHCreateItemFromParsingName Func _IShellFolder_SHBindToObject($psf, $pidl, $pbc, $riid, ByRef $pv) Local $aRes = DllCall("Shell32.dll", "long", "SHBindToObject", "ptr", $psf, "ptr", $pidl, "ptr", $pbc, "ptr", $riid, "ptr*", 0) If @error Then Return SetError(1, 0, 0) $pv = $aRes[5] Return $aRes[0] EndFunc ;==>_IShellFolder_SHBindToObject Func _SHBindToParent($pidl, $riid, ByRef $pv, ByRef $pidlLast) Local $aRes = DllCall("Shell32.dll", "long", "SHBindToParent", "ptr", $pidl, "ptr", $riid, "ptr*", 0, "ptr*", 0) If @error Then Return SetError(1, 0, 0) $pv = $aRes[3] $pidlLast = $aRes[4] Return $aRes[0] EndFunc ;==>_SHBindToParent Func _IShellFolder_StrRetToBuf($pSTRRET, $pidl, ByRef $sName, $iLength = 512) Local $aRes = DllCall("shlwapi.dll", "long", "StrRetToBufW", "ptr", $pSTRRET, "ptr", $pidl, "wstr", $sName, "uint", $iLength) If @error Then Return SetError(1, 0, 0) $sName = $aRes[3] Return $aRes[0] EndFunc ;==>_IShellFolder_StrRetToBuf Func _ExpandEnvStrings($sInput) ; thanks to blindwig for this func Dim $aPart = StringSplit($sInput, '%') If @error Then SetError(1) Return $sInput EndIf Dim $sOut = $aPart[1], $i = 2, $env = '' ;loop through the parts While $i <= $aPart[0] $env = EnvGet($aPart[$i]) If $env <> '' Then ;this part is an expandable environment variable $sOut = $sOut & $env $i = $i + 1 If $i <= $aPart[0] Then $sOut = $sOut & $aPart[$i] ElseIf $aPart[$i] = '' Then ;a double-percent is used to force a single percent $sOut = $sOut & '%' $i = $i + 1 If $i <= $aPart[0] Then $sOut = $sOut & $aPart[$i] Else ;this part is to be returned literally $sOut = $sOut & '%' & $aPart[$i] EndIf $i = $i + 1 WEnd Return $sOut EndFunc ;==>_ExpandEnvStrings Func _ReduceMemory($i_PID = -1) ;Reduces Memory Usage -- Special thanks to w0uter and jftuga If $i_PID <> -1 Then Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID) Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0]) DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0]) Else Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1) EndIf Return $ai_Return[0] EndFunc ;==>_ReduceMemory Func ToolTipEx() $htItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($ListView1)) If $htItem[0] <> -1 And WinActive($Form1_1) Then Local $itemtext = _GUICtrlListView_GetItemText($ListView1, $htItem[0]) Local $association = "" Local $type = "" If $itemtext <> $oldtip Then $attrib = FileGetAttrib($Inputtext & "" & $itemtext) Local $aItem_Rect = _GUICtrlListView_GetItemRect($ListView1, $htItem[0], 2) Local $aLV_Pos = WinGetPos(GUICtrlGetHandle($ListView1)) If IsDrive($itemtext) Then $type = "Drive" If $type <> "Drive" Then If Not StringInStr($attrib, "D") Then $ext = StringMid($itemtext, StringInStr($itemtext, '.', 0, -1)) If $ext == "" Then $type = StringUpper(StringRight($itemtext, StringLen($itemtext) - StringInStr($itemtext, ".", 0, -1))) & " File" Else $type = _WinAPI_AssocQueryString($ext, $ASSOCSTR_FRIENDLYDOCNAME) Select Case $ext = ".lnk" $scut = FileGetShortcut($Inputtext & "" & $itemtext) $association = $scut[0] Case $ext = ".exe" Or $ext = ".com" Or $ext = ".pif" $association = "Self Executable" Case Else $association = _WinAPI_AssocQueryString($ext, $ASSOCSTR_FRIENDLYAPPNAME) EndSelect EndIf $size = SizeEx(FileGetSize($Inputtext & "" & $itemtext)) Else $type = "Folder" $association = "Windows Explorer" $date = FolderDate($Inputtext & "" & $itemtext) EndIf EndIf If $association == "" Then $association = "Unknown Application" If $type <> "Folder" And $type <> "Drive" Then $tooltext = ($itemtext & @LF & $type & @LF & $size & @LF & $association & @LF & AttribExpand($attrib)) ElseIf $type == "Folder" Then $tooltext = ($itemtext & @LF & $type & @LF & $date & $association & @LF & AttribExpand($attrib)) ElseIf $type == "Drive" Then $slabel = "Label : " & DriveGetLabel($itemtext & "") If DriveGetLabel($itemtext & "") == "" Then $slabel = "Label : (No Label)" $status = "Status : " & DriveStatus($itemtext & "") $dtype = "Type : " & DriveGetType($itemtext & "") $fsystem = "File System : " & DriveGetFileSystem($itemtext & "") If DriveGetFileSystem($itemtext & "") = "UDF" Then $dtype = "Type : DVDROM" If @error == 1 Then $fsystem = "File System : Unknown" $tspace = "Total Space : " & SizeEx(DriveSpaceTotal($itemtext & "") * 1024 * 1024) $fspace = "Space Free : " & SizeEx(DriveSpaceFree($itemtext & "") * 1024 * 1024) $uspace = "Used Space : " & SizeEx((DriveSpaceTotal($itemtext & "") - DriveSpaceFree($itemtext & "")) * 1024 * 1024) $tooltext = $slabel & @LF & $status & @LF & $dtype & @LF & $fsystem & @LF & $tspace & @LF & $fspace & @LF & $uspace EndIf ToolTip($tooltext, $aLV_Pos[0] + $aItem_Rect[0], $aLV_Pos[1] + $aItem_Rect[1] + 5, "", "", 4) $oldtip = $itemtext EndIf Else ToolTip("") $oldtip = "" EndIf EndFunc ;==>ToolTipEx Func IsDrive($letter) Local $aArray = DriveGetDrive("ALL") For $i = 1 To $aArray[0] If $aArray[$i] = $letter Then Return 1 Next Return 0 EndFunc ;==>IsDrive Func FolderDate($folderpath) Local $alltime For $z = 0 To 2 $date = FileGetTime($folderpath, $z) Select Case $z == 0 $dw = "Modified : " Case $z == 1 $dw = "Created : " Case $z == 2 $dw = "Accessed : " EndSelect Local $datetime = "", $AP = "AM" For $i = 0 To 2 $datetime &= $date[$i] If $i < 2 Then $datetime &= "-" If $i = 2 Then $datetime &= " " Next If $date[3] > 12 Then $date[3] = $date[3] - 12 $AP = "PM" EndIf If $date[3] = 12 Then $AP = "PM" If $date[3] = 0 Then $date[3] = 12 $time = $date[3] & ":" & $date[4] & ":" & $date[5] & " " & $AP $alltime &= $dw & $datetime & " " & $time & @LF Next Return $alltime EndFunc ;==>FolderDate Func SizeEx($size) Select Case $size = 0 $size = "0 Bytes" Case $size >= 1073741824 $size = Round($size / 1073741824, 2) & " " & "GB" Case $size >= 1048576 $size = Round($size / 1048576, 2) & " " & "MB" Case $size >= 1024 $size = Round($size / 1024, 2) & " " & "KB" Case $size < 1024 $size = Int($size) & " " & "Bytes" EndSelect Return $size EndFunc ;==>SizeEx Func AttribExpand($sAttribute) Local $aInput = StringSplit("R,A,S,H,N,D,O,C,T", ",") Local $aOutput = StringSplit("Read-only /,Archive /,System /,Hidden /" & _ ",Normal /,Directory /,Offline /,Compressed /,Temporary /", ",") For $i = 1 To $aInput[0] $sAttribute = StringReplace($sAttribute, $aInput[$i], $aOutput[$i], 0, 1) Next $sAttribute = StringTrimRight($sAttribute, 2) Return $sAttribute EndFunc ;==>AttribExpand Link to pastebin formatted code: http://pastebin.com/bi1Abjmn Edited September 24, 2012 by Zohran Had to use code='text'; because of that I added pastebin url for this poster Skitty and qsek 2 Link to comment Share on other sites More sharing options...
Yashied Posted March 27, 2012 Share Posted March 27, 2012 Works nicely. My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More... Link to comment Share on other sites More sharing options...
Zohran Posted March 27, 2012 Author Share Posted March 27, 2012 (edited) Works nicely. thanks.just a little update in above code.updated Edited March 27, 2012 by Zohran Link to comment Share on other sites More sharing options...
Skitty Posted March 27, 2012 Share Posted March 27, 2012 I like it, it's like a very low featured shell for browsing files and shellexecuting things left and right. Just the other day I was looking through a script trying to figure out how they were displaying items in this style since it's one of those things I haven't learned yet and couldn't figure it out and I couldn't seem to find a reference for it in the help docs, I couldn't find out how it's done partly because the script was huge and the number of oddly/similarly named variables was a little overwhelming, but this one is small and easy on the brain, thanks for the share, keep it up. Link to comment Share on other sites More sharing options...
Zohran Posted March 28, 2012 Author Share Posted March 28, 2012 thanks eveybody Link to comment Share on other sites More sharing options...
Skitty Posted March 30, 2012 Share Posted March 30, 2012 thanks eveybodyI hope you don't mind I use this in a project that I posted around here called process dictator, it's a task manager and I want to use this concept for enumerating windows in tab section, so what do you say? I'm going to be done with it soon and I'm going to post the updated version here in example scripts and a modified version of your code will be included with credits to you of course. Link to comment Share on other sites More sharing options...
Zohran Posted March 31, 2012 Author Share Posted March 31, 2012 I hope you don't mind I use this in a project that I posted around here called process dictator, it's a task manager and I want to use this concept for enumerating windows in tab section, so what do you say? I'm going to be done with it soon and I'm going to post the updated version here in example scripts and a modified version of your code will be included with credits to you of course.sure. no problem Link to comment Share on other sites More sharing options...
Skitty Posted March 31, 2012 Share Posted March 31, 2012 (edited) One thing though, how to select multiple items without selecting item in between and also retrieve array of selected multiple items?Ok, I see that this seems to be windows default behavior. Edited April 24, 2012 by ApudAngelorum Link to comment Share on other sites More sharing options...
Zohran Posted April 24, 2012 Author Share Posted April 24, 2012 Above Program Updated. Link to comment Share on other sites More sharing options...
Rutger83 Posted September 19, 2012 Share Posted September 19, 2012 The autoit tags are not working in the openings post, maybe you could update it some time again? Link to comment Share on other sites More sharing options...
money Posted September 22, 2012 Share Posted September 22, 2012 Yes, please update your code. Link to comment Share on other sites More sharing options...
Zohran Posted September 24, 2012 Author Share Posted September 24, 2012 ok Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now