Leaderboard
Popular Content
Showing content with the highest reputation on 03/25/2012 in all areas
-
Displays Correct Icons up to the max. some extra features added. #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/bi1Abjmn1 point
-
Subclassing windows in other processes
qsek reacted to WideBoyDixon for a topic
This arose from a topic in the help forum and I'm just cross-posting here at Sandin's suggestion. The problem was how to monitor messages going to another window not controlled by AutoIt. After much searching I found a suitable workaround. First of all you need to download this package: http://allapi.mentalis.org/vbexamples/vbex...xample=DSSUBCLS Unzip dssubcls.dll in to the same folder as your script. You can then use it to "subclass" any other window. My example in Notepad: #include <WindowsConstants.au3> #include <GuiListbox.au3> Global $hList _Main() Exit Func _Main() Local $hGUI = GUICreate("Subclass", 400, 400) Local $cList = GUICtrlCreateList("", 8, 8, 384, 384, BitOR($WS_BORDER, $WS_VSCROLL)) GUISetState() $hList = GUICtrlGetHandle($cList) Local $hDSSUBCLS = DllOpen("dssubcls.dll") Run("Notepad.exe") WinWait("[CLASS:Notepad]") Local $hNotepad = WinGetHandle("[CLASS:Notepad]") Local $hCallback = DllCallbackRegister("_MyCallback", "long", "long;long;long") Local $aRet = DllCall($hDSSUBCLS, "long", "SubClass", "hwnd", $hNotepad, "ptr", DllCallbackGetPtr($hCallback), "long", 0, "long", 0, "long", 0, "long", 1) $aRet = DllCall($hDSSUBCLS, "long", "UseSendMessage", "long", 1) While GUIGetMsg() <> -3 Sleep(100) WEnd DllClose($hDSSUBCLS) GUIDelete() EndFunc ;==>_Main Func _MyCallback($uiMsg, $wParam, $lParam) Switch $uiMsg Case $WM_COMMAND If $lParam = 0 Then _GUICtrlListBox_AddString($hList, "WM_COMMAND(" & $wParam & "," & $lParam & ")") EndIf EndSwitch Return 0 EndFunc ;==>_MyCallback Selecting a menu item from Notepad puts a message in to the list box. Should work for other windows and applications too although I'm not sure what will happen under Vista/Windows7 and whether you're allowed to do this. Note that the "hooked" application does tend to run a little slower and I suspect that's because it's firing messages at _MyCallback() which is taking too long to respond. However, I'm not certain about this. More information about the "SubClass" function can be found in the TXT file that's also in the package. Hope this helps. Have fun. WBD1 point -
Hi all I've tried to download the mysql installation file using $file_to_get = "http://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-5.5.21.0.msi/from/http://mirrors.dedipower.com/www.mysql.com/" InetGet($file_to_get, $file_to_save,1 ,0) However it refuses to dowload - any thoughts why?1 point
-
Now it's possible to display shell context menu in a control(treeview,listview,list...) just like you right click on a file/folder in windows explorer. Hope you will like it The idea and original code come from http://www.codeproject.com/KB/cs/shellContextMenu.aspx, And the dll file was compiled by sd007 ONE PROBLEM : the program works fine on XP, but several items won't show on win7-x64, such as unlocker, foobar2000...Anyone can fix this? Here is an simple apply based on Yashied‘’s TVExplorer UDF #Include <GUIConstantsEx.au3> #Include <GUITreeView.au3> #Include <TVExplorer.au3> #Include <TreeViewConstants.au3> #Include <WindowsConstants.au3> #Include <WinAPIEx.au3> Opt('GUIOnEventMode', 1) Global $hForm, $hTV, $Input, $hFocus = 0, $Dummy, $Style Global $__RegAsmPath, $ShellContextMenu ;COM Handle _NETFramework_Load(@ScriptDir & "ExplorerShellContextMenu.dll") If Not @error Then $ShellContextMenu = ObjCreate("ExplorerShellContextMenu.ShowContextMenu") Else MsgBox(0,'',"error=" & @error &@CRLF&@CRLF& _ "1=ExplorerShellContextMenu.dll has been registered"&@CRLF& _ "2=DLL file does not exist"&@CRLF& _ "3=.NET Framework 2.0 required!"&@CRLF& _ "4=can't register the .net DLL") EndIf If Not _WinAPI_DwmIsCompositionEnabled() Then $Style = $WS_EX_COMPOSITED Else $Style = -1 EndIf $hForm = GUICreate('TVExplorer UDF Example', 700, 406, -1, -1, -1, $Style) GUISetOnEvent($GUI_EVENT_CLOSE, '_GUIEvent') GUISetIcon(@WindowsDir & 'explorer.exe') $Input = GUICtrlCreateInput('', 20, 20, 660, 19) GUICtrlSetState(-1, $GUI_DISABLE) $hTV = _GUICtrlTVExplorer_Create('', 20, 48, 660, 310, -1, $WS_EX_CLIENTEDGE, -1, '_TVEvent') _TVSetPath($Input, _GUICtrlTVExplorer_GetSelected($hTV)) _GUICtrlTVExplorer_SetExplorerStyle($hTV) $Dummy = GUICtrlCreateDummy() GUICtrlSetOnEvent(-1, '_GUIEvent') HotKeySet('{F5}', '_TVRefresh') GUISetState() While 1 Sleep(1000) WEnd Func _GUIEvent() Local $Path Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE GUIDelete() _GUICtrlTVExplorer_DestroyAll() Exit Case $Dummy $Path = _GUICtrlTVExplorer_GetSelected($hFocus) _GUICtrlTVExplorer_AttachFolder($hFocus) _GUICtrlTVExplorer_Expand($hFocus, $Path, 0) $hFocus = 0 EndSwitch EndFunc ;==>_GUIEvent Func _TVEvent($hWnd, $iMsg, $sPath, $hItem) Switch $iMsg Case $TV_NOTIFY_BEGINUPDATE GUISetCursor(1, 1) Case $TV_NOTIFY_ENDUPDATE GUISetCursor(2) Case $TV_NOTIFY_SELCHANGED If $hTV = $hWnd Then _TVSetPath($Input, $sPath) EndIf Case $TV_NOTIFY_DBLCLK ; Nothing Case $TV_NOTIFY_RCLICK Local $asCurInfo = GUIGetCursorInfo() ClientToScreen($hForm, $asCurInfo[0], $asCurInfo[1]) $ShellContextMenu.Show($sPath,$asCurInfo[0],$asCurInfo[1]) Case $TV_NOTIFY_DELETINGITEM ; Nothing Case $TV_NOTIFY_DISKMOUNTED ; Nothing Case $TV_NOTIFY_DISKUNMOUNTED ; Nothing EndSwitch EndFunc ;==>_TVEvent Func _TVSetPath($iInput, $sPath) Local $Text = _WinAPI_PathCompactPath(GUICtrlGetHandle($iInput), $sPath, -2) If GUICtrlRead($iInput) <> $Text Then GUICtrlSetData($iInput, $Text) EndIf EndFunc ;==>_TVSetPath Func _TVRefresh() Local $hWnd = _WinAPI_GetFocus() If $hTV = $hWnd Then If Not $hFocus Then $hFocus = $hWnd GUICtrlSendToDummy($Dummy) EndIf Return EndIf HotKeySet('{F5}') Send('{F5}') HotKeySet('{F5}', '_TVRefresh') EndFunc ;==>_TVRefresh Func _NETFramework_Load($DLL_File) $ShellContextMenu = ObjCreate("ExplorerShellContextMenu.ShowContextMenu") If IsObj($ShellContextMenu) Then Return SetError(1,0,0) ; already registered If Not FileExists($DLL_File) Then Return SetError(2,0,0) ; == file does not exist Local $sRoot = RegRead("HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFramework", "InstallRoot") If @error Then Return SetError(3,0,0) ; == .NET Framework 2.0 required! Local $aFolder = _FileListToArray($sRoot , "*", 2), $sNETFolder = '' For $i = $aFolder[0] To 1 Step -1 If StringRegExp($aFolder[$i], "v2.0.d+", 0) Then $sNETFolder = $aFolder[$i] ExitLoop EndIf Next If $sNETFolder = '' Then Return SetError(3,0,0) ; == NET Framework 2.0 required! $__RegAsmPath = $sRoot & $sNETFolder & "RegAsm.exe" If Not RunWait($__RegAsmPath & " /codebase " & $DLL_File, @ScriptDir, @SW_HIDE) Then Return SetError(4,0,0); can't register the .net DLL Return 1 EndFunc ;==>_NETFramework_Load Func __UnLoad_NET_Dll($DLL_File) RunWait($__RegAsmPath & " /unregister " & $DLL_File, @ScriptDir, @SW_HIDE) ; unregister the .net DLL EndFunc Func ClientToScreen($hWnd, ByRef $x, ByRef $y) Local $stPoint = DllStructCreate("int;int") DllStructSetData($stPoint, 1, $x) DllStructSetData($stPoint, 2, $y) DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint)) $x = DllStructGetData($stPoint, 1) $y = DllStructGetData($stPoint, 2) ; release Struct not really needed as it is a local $stPoint = 0 EndFunc ;==>ClientToScreen ExplorerShellContextMenu.7z1 point
-
Wow that's pretty cool example of desktop remote. I'll keep follow the progress of this project.1 point