Sign in to follow this  
Followers 0
Zohran

Advanced Icon Displayer In Listview

12 posts in this topic

#1 ·  Posted (edited)

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/bi1Abjmn

Edited by Zohran
Had to use code='text'; because of that I added pastebin url for this poster
2 people like this

Share this post


Link to post
Share on other sites



#3 ·  Posted (edited)

Works nicely.

:oops:

thanks.

just a little update in above code.updated

Edited by Zohran

Share this post


Link to post
Share on other sites

I like it, it's like a very low featured shell for browsing files and shellexecuting things left and right.

Just the other day I was looking through a script trying to figure out how they were displaying items in this style since it's one of those things I haven't learned yet and couldn't figure it out and I couldn't seem to find a reference for it in the help docs, I couldn't find out how it's done partly because the script was huge and the number of oddly/similarly named variables was a little overwhelming, but this one is small and easy on the brain, thanks for the share, keep it up.


Things that I've done..

Icon Resource Editor: icon resource editor 

AutoIt Piano: a piano

AutoIt Unlocker: unlocks files when you want to delete them

Colorful tooltips: a wrapper for the tool tips UDF

Rouge GoogleBot: a full screen animation

ASciTE text editor: a text editor written in autoit

Warning: Posts by this user are subject to change or may disappear without notice.

Share this post


Link to post
Share on other sites

thanks eveybody

Share this post


Link to post
Share on other sites

thanks eveybody

I hope you don't mind I use this in a project that I posted around here called process dictator, it's a task manager and I want to use this concept for enumerating windows in tab section, so what do you say? I'm going to be done with it soon and I'm going to post the updated version here in example scripts and a modified version of your code will be included with credits to you of course.


Things that I've done..

Icon Resource Editor: icon resource editor 

AutoIt Piano: a piano

AutoIt Unlocker: unlocks files when you want to delete them

Colorful tooltips: a wrapper for the tool tips UDF

Rouge GoogleBot: a full screen animation

ASciTE text editor: a text editor written in autoit

Warning: Posts by this user are subject to change or may disappear without notice.

Share this post


Link to post
Share on other sites

I hope you don't mind I use this in a project that I posted around here called process dictator, it's a task manager and I want to use this concept for enumerating windows in tab section, so what do you say? I'm going to be done with it soon and I'm going to post the updated version here in example scripts and a modified version of your code will be included with credits to you of course.

sure. no problem

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

One thing though, how to select multiple items without selecting item in between and also retrieve array of selected multiple items?

Ok, I see that this seems to be windows default behavior.

Edited by ApudAngelorum

Things that I've done..

Icon Resource Editor: icon resource editor 

AutoIt Piano: a piano

AutoIt Unlocker: unlocks files when you want to delete them

Colorful tooltips: a wrapper for the tool tips UDF

Rouge GoogleBot: a full screen animation

ASciTE text editor: a text editor written in autoit

Warning: Posts by this user are subject to change or may disappear without notice.

Share this post


Link to post
Share on other sites

Above Program Updated.

Share this post


Link to post
Share on other sites

The autoit tags are not working in the openings post, maybe you could update it some time again?

Share this post


Link to post
Share on other sites

Yes, please update your code.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0