Leaderboard
Popular Content
Showing content with the highest reputation on 03/27/2012 in all areas
-
LAST VERSION - 3.8 03-Jul-12 This library contains the WinAPI functions are not included for unknown reasons to the native AutoIt WinAPI library. I use this UDF in nearly all of my programs, and decided to share it with the AutoIt community. I agree that over time some of these functions will be part of the native AutoIt library, but still... The library includes some undocumented, but useful functions (eg _WinAPI_GetFontResourceInfo()). The library also contains all the necessary constants to work with the appropriate functions. Most functions from this UDF intended for experienced users, but beginners will find the same lot of useful information for yourself. I will be to periodically add new functions to the library. The archive contains WinAPIEx library, and as usual an excellent examples from me. Some examples I took from this forum and to simplify them for better understanding. For those who use SciTE (full version) I have prepared the au3.userudfs.properties and au3.user.calltips.api files to highlight functions from this UDF in your scripts. Just copy this files to ...SciTEProperties and ...SciTEAPI, respectively. I hope this UDF will be useful for many as for me. I look forward to any feedback and suggestions. Maybe somebody wants to add new WinAPI functions? Credits Available functions Files to download WinAPIEx UDF v3.8 for AutoIt 3.3.6.1 Previous downloads: 27953 WinAPIEx UDF v3.8 for AutoIt 3.3.8.x Previous downloads: 148501 point
-
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
-
V1.33 : Hi guys! this release fixes some stability and lock-up issues and is now extremely stable! (Thanks to Jens and Oliver for their help with extensive de-bugging and testing). There's also a new ButtonEx example and various new commands and features (Please see history). Please note ProGUI is license-ware and will timeout at around 5 minutes per session so that you can trial out ProGUI with your applications. A license for the standard version is only €30 (EUR) however! There is also a ProGUI Gold license which is slightly more expensive but Includes full source code of ProGUI and a license to use it in your own projects: €45 (EUR) http://www.progui.co.uk ProGUI Forums http://www.progui.co.uk/phpBB/index.php ProGUI Main Archive: Includes DLL version, AutoIt wrapper and reference manual. (both native 32 bit and 64 bit versions of each) http://www.progui.co.uk/downloads/ProGUI.rar http://www.progui.co.uk/downloads/ProGUI.zip Examples: http://www.progui.co.uk/downloads/ProGUI_AutoIt_Examples.rar http://www.progui.co.uk/downloads/ProGUI_AutoIt_Examples.zip Main Features · Easy to use and simple API with commands such as "MenuTitleEx(title.s)" · Easy Installation · Extremely fast rendering with internal caching and intelligent double-buffering. · One of the most accurate replica of Whidbey, Office 2007 and Office 2003 styles that exist as well as improvements over Microsoft's engine such as flicker free menu tracking and superior menu scrolling! · Native 32 bit and 64 bit versions! · Windows 7, Vista, XP, 2008, 2003 compatible. · Unicode support. . Full Source Code included in ProGUI Gold edition. · Rebars! (IE Explorer style container control for toolbars), multiple rebars on multiple windows! · Extended rebar functionality including new Office 2007 and Office 2003 style, auto vertical resizing and user vertical resizing. · Super smooth window resizing of components, no wild jumping or flickering! · Option for automatic double buffering of rebars when resizing! · Full Automatic Chevron support for rebars, see IE Explorer - resize the window too small and click on the chevron to see a popup menu with toolbar icons. · Extended toolbars, full 32bit Alpha masked icon/image support of any size for toolbar buttons with separate images for normal, hot and disabled states. As many toolbars as you want on multiple windows! · New Office 2007/Office 2003 Toolstrip style toolbars! . Office 2007/Office 2003 styled ComboBoxes in toolbars/rebars. · Support for drop down buttons in toolbars, just pass a popup menu or extended popup menu to the command! · Extended menus! Have cool "floating" menus contained in a rebar/container with ease! Full support for 32bit Alpha masked icons/images of any size in menus with support for different images for normal, hot and disabled states! Includes extended system menu and popup menu. Different styles of menus available for example: Office 2007 style menus, Office 2003 style menus, Office XP/Whidbey style menus, IE Explorer style, Classic/Mozilla Firefox Style and other styles. Automatic chevrons on menus when window resized too small! Automatic detection of system font change and resized accordingly. Full keyboard navigation and hot-key support. When menu goes off screen automatically fits inside screen (see Explorer for a bad implementation of this, see Firefox for a good implementation). · Theme adaptive custom user defined colours for User Interface styles. Thanks! Chris.1 point
-
Wow. Impressive library and collection of interfaces there. Very nice!1 point
-
I really like what you did. I really appreciated _IECreate2, but didn't like the process polling algorithm. I have enhanced what you posted to further follow the IE.au3 style, made it more bullet-proof and included a working example. Haven't tested all of the failure scenarios, so your testing and that of others would be good. Nice. Dale #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <Constants.au3> #include <IE.au3> Dim $hGUI, $oIE, $sURL, $iLeft, $iTop, $iHeight, $iWidth $sURL = "http://www.google.com" $iLeft = 0 $iTop = 0 $iWidth = 1024 $iHeight = 768 $hGUI = GUICreate("Test", $iWidth, $iHeight) $oIE = IECreatePseudoEmbedded($iLeft, $iTop, $iWidth, $iHeight, $hGUI) _IENavigate($oIE, $sURL) GUISetState(@SW_SHOW, $hGUI) While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then _IEQuit($oIE) Exit EndIf WEnd Exit Func IECreatePseudoEmbedded($i_Left, $i_Top, $i_Width, $i_Height, $h_Parent, $f_ShowWin = False, $i_Timeout = 30000) Local Const $i_Random = Random(10001, 99999, 1) Local $i_PID, $o_IE, $h_HWND, $h_Timer = TimerInit() $i_PID = Run(@ProgramFilesDir & "Internet Exploreriexplore.exe -k " & "about:blank-" & $i_Random, "", @SW_HIDE) $f_ErrorNotify = _IEErrorNotify() _IEErrorNotify(False) While Not IsObj($o_IE) $o_IE = _IEAttach("about:blank-" & $i_Random, "URL") If TimerDiff($h_Timer) > $i_Timeout Then _IEErrorNotify($f_ErrorNotify) Return SetError(1, 0, 0) EndIf Sleep(200) WEnd _IEErrorNotify($f_ErrorNotify) $h_HWND = _IEPropertyGet($o_IE, "hwnd") _WinAPI_SetParent($h_HWND, $h_Parent) _WinAPI_MoveWindow($h_HWND, $i_Left, $i_Top, $i_Width, $i_Height, True) _WinAPI_SetWindowLong($h_HWND, $GWL_STYLE, $WS_POPUP + $WS_VISIBLE) If $f_ShowWin Then WinSetState($h_HWND, "", @SW_SHOW) EndIf Return $o_IE EndFunc ;==>IECreatePseudoEmbedded Notes: This modification move navigation to the URL out of the function. It creates a random URL for the initial creation so that there will be no trouble with duplicate windows. It adds a timeout waiting for the browser to be created. Updated: Updated to use JohnOne's idle loop suggestion (below)1 point
-
I've corrected the script so that you'll get the array done correctly, see the lines marked with "<<<<<<<<<<<<<" for comments. #include <array.au3> Func _CheckPlace($1, $2, $3) Local $pos = PixelSearch(20, 500, 21, 501, 0xFFFFFF, 100) Return $pos EndFunc ;==>_CheckPlace $WinData = WinGetPos("Google - Mozilla Firefox") $WindowCount = 0 $i = 0 Global $WindowArray[200][2] ; <<<<<<<<< Moved this outside of the loop, because you redeclared it every time through the loop For $k = 0 To 5 ;Reached bottom of window Local $Place[2][1] = [[$WinData[0]],[0 + $i]] ;Starting Pos Local $Space[2][1] = [[$WinData[1]],[210]] ;Reach $SubFolderID = "INSERT INI SEKTIONNAME" $pos = _CheckPlace($SubFolderID, $Place, $Space) If IsArray($pos) Then $i = $pos[1] - $WinData[1] + 1 $WindowCount = $WindowCount + 1 If UBound($WindowArray) Then ReDim $WindowArray[UBound($WindowArray) * 2][2] EndIf $WindowArray[$WindowCount][0] = $pos[0] $WindowArray[$WindowCount][1] = $pos[1] Else $i = $i + 58 EndIf Next ReDim $WindowArray[$WindowCount][2] _ArrayDisplay($WindowArray) ; displays the contents of $WindowArray to make sure we're getting what we think we're supposed to. Debugging only For $i = 1 To UBound($WindowArray) - 1 ; <<<<<<<< Changed it to 1 to Ubound, because $WindowArray starts at 1 MsgBox(0, "", "Position of SubFolder " & $i & "in Folder X: " & $WindowArray[$i][0] & "and Y " & $WindowArray[$i][1]) ; Don't need $I + 1 any longer due to starting at 1 in the loop now MouseMove($WindowArray[$i][0], $WindowArray[$i][1]) Next1 point
-
I found on forum WinINet UDF (a little modified because of conflicts between variables from different UDFs) and I wrote an example using it but I don't see any performance even if are used dll calls. With my initial example server use max 10% CPU and client max 15% CPU (I run both on same PC). About memory server use ~15Mb memory and client same. And this example using WinINet: server use 15% CPU and max 25Mb memory and client use 25% CPU and 25-50 Mb memory (very variable). Let me know how it works for you. WinInet Example.rar1 point
-
Congratulations. Now you can start improving the script. From the code snippets I have seen, there are missing calls to Release and destroy functions. If you use the application for some time, the memory leaks wil result in unnecesary high memory consumption.1 point