Dateibrowser mit Miniaturansicht von JPEG-Dateien mit AutoIt realisieren

  • Hallo zusammen,

    ich möchte im Zuge der Entwicklung einer Anwendung einen Dateibrowser ähnlich dem Windows-Explorer mit AutoIt realisieren, wo für die Dateien ICONs aber auch Miniaturansichten von JPEG-Dateien angezeigt und ausgewählt werden können. Kann mir hier jemand einen Tipp geben, wie man sowas mit AutoIt machen könnte resp. brauchbare UDFs dazu nennen. Vielleicht hat jemand sowas ja bereits realisiert und man kann die "Codefragmente" benutzen und muss das Rad nicht neu erfinden.

    Danke im Voraus.

    Ghostbuster

  • [ ... du kannst ein Explorer Object dafür nutzen ... ]

    Danke für den Tipp. Verrätst Du mir auch noch, wie man das prinzipiell macht? Kenne mich mit Windows leider nicht so aus.

    Danke,

    Ghostbuster

    • Offizieller Beitrag

    Hi,

    hier ein erster Ansatz.

    Spoiler anzeigen
    [autoit]

    #include<WinAPI.au3>
    #include<WindowsConstants.au3>
    #include<FileDialogsEx.au3>
    ; _FileDialogsEx.au3 example #1:
    ; create big resizeable file open dialog, defaulting to thumbnails view
    ; demonstrates how to set size/position of dialog window, how to set default view mode for listview.

    [/autoit] [autoit][/autoit] [autoit]

    Global $f_CDN_Start = 1

    [/autoit] [autoit][/autoit] [autoit]

    $Return = _FileOpenDialogEx("Open picture", @WindowsDir & "\Web\Wallpaper", "All Files (*.*)", BitOR($OFN_ENABLESIZING, $OFN_ALLOWMULTISELECT), "", 0, "_OFN_HookProc")
    If @error Then
    ConsoleWrite('No file selected.' & @CRLF)
    Else
    ConsoleWrite($Return & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _OFN_HookProc($hWnd, $Msg, $wParam, $lParam)
    Switch $Msg
    Case $WM_NOTIFY
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
    $tNMHDR = DllStructCreate("hwnd hWndFrom;int idFrom;int code", $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iIDFrom = DllStructGetData($tNMHDR, "idFrom")
    $iCode = DllStructGetData($tNMHDR, "code")
    Switch $iCode
    Case $CDN_INITDONE
    Case $CDN_FOLDERCHANGE
    If $f_CDN_Start Then;if executing first time
    Local $hODLV = _FindWindowEx($hWndFrom, 0, "SHELLDLL_DefView", "")
    If $hODLV <> 0 Then
    DllCall('user32.dll','int','SendMessage','hwnd',$hODLV,'uint',$WM_COMMAND,'wparam',$ODM_VIEW_THUMBS,'lparam',0) ; Thumbs
    ;~ DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hODLV, 'uint', $WM_COMMAND, 'wparam', $ODM_VIEW_DETAIL, 'lparam', 0) ; Detail
    EndIf
    WinMove($hWndFrom, "", 0, 0, 800, 600, 0)
    $f_CDN_Start = 0;to make sure these tweaks happens only once.
    EndIf
    Case $CDN_SELCHANGE
    Case $CDN_FILEOK
    EndSwitch
    Case Else
    EndSwitch
    EndFunc ;==>_OFN_HookProc
    Func _FindWindowEx($hWndParent, $hWndChildAfter, $sClassName, $sWinTitle = "")
    Local $aRet = DllCall('user32.dll', 'hwnd', 'FindWindowEx', 'hwnd', $hWndParent, 'hwnd', $hWndChildAfter, 'str', $sClassName, 'str', $sWinTitle)
    If $aRet[0] = 0 Then ConsoleWrite('_FindWindowEx() Error : ' & _WinAPI_GetLastErrorMessage())
    Return $aRet[0]
    EndFunc ;==>_FindWindowEx
    Exit

    [/autoit]

    Mega

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include<Constants.au3>
    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    ;=
    ; Customizable File Open/Save dialogs
    ; by Siao
    ;=

    [/autoit] [autoit][/autoit] [autoit]

    #Region OFN Constants

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $OFN_ALLOWMULTISELECT = 0x200
    Global Const $OFN_CREATEPROMPT = 0x2000
    Global Const $OFN_DONTADDTORECENT = 0x2000000
    Global Const $OFN_ENABLEHOOK = 0x20
    Global Const $OFN_ENABLEINCLUDENOTIFY = 0x400000
    Global Const $OFN_ENABLESIZING = 0x800000
    Global Const $OFN_ENABLETEMPLATE = 0x40
    Global Const $OFN_ENABLETEMPLATEHANDLE = 0x80
    Global Const $OFN_EXPLORER = 0x80000
    Global Const $OFN_EXTENSIONDIFFERENT = 0x400
    Global Const $OFN_EX_NOPLACESBAR = 0x1
    Global Const $OFN_FILEMUSTEXIST = 0x1000
    Global Const $OFN_FORCESHOWHIDDEN = 0x10000000
    Global Const $OFN_HIDEREADONLY = 0x4
    Global Const $OFN_LONGNAMES = 0x200000
    Global Const $OFN_NOCHANGEDIR = 0x8
    Global Const $OFN_NODEREFERENCELINKS = 0x100000
    Global Const $OFN_NOLONGNAMES = 0x40000
    Global Const $OFN_NONETWORKBUTTON = 0x20000
    Global Const $OFN_NOREADONLYRETURN = 0x8000
    Global Const $OFN_NOTESTFILECREATE = 0x10000
    Global Const $OFN_NOVALIDATE = 0x100
    Global Const $OFN_OVERWRITEPROMPT = 0x2
    Global Const $OFN_PATHMUSTEXIST = 0x800
    Global Const $OFN_READONLY = 0x1
    Global Const $OFN_SHAREAWARE = 0x4000
    Global Const $OFN_SHAREFALLTHROUGH = 2
    Global Const $OFN_SHARENOWARN = 1
    Global Const $OFN_SHAREWARN = 0
    Global Const $OFN_SHOWHELP = 0x10
    Global Const $OFN_USEMONIKERS = 0x1000000
    Global Const $OFS_MAXPATHNAME = 128

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $CDM_FIRST = 1124
    Global Const $CDM_GETFILEPATH = $CDM_FIRST + 0x1
    Global Const $CDM_GETFOLDERIDLIST = $CDM_FIRST + 0x3
    Global Const $CDM_GETFOLDERPATH = $CDM_FIRST + 0x2
    Global Const $CDM_GETSPEC = $CDM_FIRST + 0x0
    Global Const $CDM_HIDECONTROL = $CDM_FIRST + 0x5
    Global Const $CDM_SETCONTROLTEXT = $CDM_FIRST + 0x4
    Global Const $CDM_SETDEFEXT = $CDM_FIRST + 0x6
    Global Const $CDM_LAST = 1224

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $CDN_FIRST = -601
    Global Const $CDN_INITDONE = $CDN_FIRST - 0x0
    Global Const $CDN_INCLUDEITEM = $CDN_FIRST - 0x7
    Global Const $CDN_FOLDERCHANGE = $CDN_FIRST - 0x2
    Global Const $CDN_HELP = $CDN_FIRST - 0x4
    Global Const $CDN_SELCHANGE = $CDN_FIRST - 0x1
    Global Const $CDN_TYPECHANGE = $CDN_FIRST - 0x6
    Global Const $CDN_SHAREVIOLATION = $CDN_FIRST - 0x3
    Global Const $CDN_FILEOK = $CDN_FIRST - 0x5
    Global Const $CDN_LAST = -699

    [/autoit] [autoit][/autoit] [autoit]

    ;;explorer style dialog control indentifiers
    Global Const $chx1 = 0x410 ;The read-only check box
    Global Const $cmb1 = 0x470 ;Drop-down combo box that displays the list of file type filters
    Global Const $stc2 = 0x441 ;Label for the cmb1 combo box
    Global Const $cmb2 = 0x471 ;Drop-down combo box that displays the current drive or folder, and that allows the user to select a drive or folder to open
    Global Const $stc4 = 0x443 ;Label for the cmb2 combo box
    Global Const $edt1 = 0x480;Edit control that displays the name of the current file, or allows the user to type the name of the file to open. Compare with cmb13.
    Global Const $stc3 = 0x442 ;Label for the cmb13 combo box and the edt1 edit control
    Global Const $lst1 = 0x460 ;List box that displays the contents of the current drive or folder
    Global Const $stc1 = 0x440 ;Label for the lst1 list box
    ;~ Global Const $IDOK = 1 ;The OK command button (push button)
    ;~ Global Const $IDCANCEL = 2 ;The Cancel command button (push button)
    Global Const $pshHelp = 0x040e ;The Help command button (push button)

    [/autoit] [autoit][/autoit] [autoit]

    ;; reverse-engineered command codes for SHELLDLL_DefView (Paul DiLascia, MSDN Magazine — March 2004)
    Global Const $ODM_VIEW_ICONS = 0x7029
    Global Const $ODM_VIEW_LIST = 0x702b
    Global Const $ODM_VIEW_DETAIL = 0x702c
    Global Const $ODM_VIEW_THUMBS = 0x702d
    Global Const $ODM_VIEW_TILES = 0x702e

    [/autoit] [autoit][/autoit] [autoit]

    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    ;#
    ; _FileOpenDialogEx()
    ; Initiates a customizable Open File Dialog.
    ; Parameters:
    ; $sTitle - dialog title, see FileOpenDialog()
    ; $sInitDir - initial folder, see FileOpenDialog()
    ; $sFilter - file type filter, see FileOpenDialog()
    ; $iOptions - can be one or combination of the following:
    ; $OFN_FILEMUSTEXIST
    ; $OFN_PATHMUSTEXIST
    ; $OFN_ALLOWMULTISELECT
    ; $OFN_CREATEPROMPT
    ; $OFN_ENABLESIZING
    ; $OFN_DONTADDTORECENT
    ; $OFN_FORCESHOWHIDDEN
    ; $OFN_NONETWORKBUTTON
    ; $OFN_EX_NOPLACESBAR
    ;
    ; $sDefaultName - default filename, see FileOpenDialog()
    ; $hParent - handle of dialog's parent window (0 if none)
    ; $sHookName - name of user defined dialog hook procedure ("" if none). See examples.
    ; $hTemplate - handle to a file or memory object containing custom dialog template (0 if none). See examples.
    ; $sTemplateName - name of a dialog template resource in the module identified by the $hTemplate ("" if none or if $hTemplate is memory object handle). See examples.
    ; Return values:
    ; Success: string value of chosen filename(s), see FileOpenDialog()
    ; Failure: Sets @error to 1
    ; Remarks:
    ; Using hook function you can customize dialog to greater extent - hide/show controls, change text of controls, and do other neat things.
    ; Hook function should have 4 params ($hWnd, $Msg, $wParam, $lParam) and works similar to GuiRegisterMsg() functions. For more information refer http://msdn2.microsoft.com/en-us/library/ms646960(VS.85).aspx
    ; Using custom templates you can add controls to a common dialog. To handle these custom controls, use hook function.
    ;#
    Func _FileOpenDialogEx($sTitle = "", $sInitDir = "", $sFilter = "All Files (*.*)", $iOptions = 0, $sDefaultName = "", $hParent=0, $sHookName="", $hTemplate=0, $sTemplateName="")

    [/autoit] [autoit][/autoit] [autoit]

    Local $sRet = _GetOpenSaveFileName('GetOpenFileName', $sHookName, $hTemplate, $sTemplateName, $hParent, $sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName)
    If @error Then SetError(@error)
    Return $sRet

    EndFunc
    ;#
    ; _FileSaveDialogEx()
    ; Initiates a customizable Save File Dialog.
    ; Parameters:
    ; $sTitle - dialog title, see FileSaveDialog()
    ; $sInitDir - initial folder, see FileSaveDialog()
    ; $sFilter - file type filter, see FileSaveDialog()
    ; $iOptions - can be one or combination of the following:
    ; $OFN_PATHMUSTEXIST
    ; $OFN_OVERWRITEPROMPT
    ; $OFN_ENABLESIZING
    ; $OFN_DONTADDTORECENT
    ; $OFN_FORCESHOWHIDDEN
    ; $OFN_NONETWORKBUTTON
    ; $OFN_EX_NOPLACESBAR
    ;
    ; $sDefaultName - default filename, see FileSaveDialog()
    ; $hParent - handle of dialog's parent window (0 if none)
    ; $sHookName - name of user defined dialog hook procedure ("" if none). See examples.
    ; $hTemplate - handle to a file or memory object containing custom dialog template (0 if none). See examples.
    ; $sTemplateName - name of a dialog template resource in the module identified by the $hTemplate ("" if none or if $hTemplate is memory object handle). See examples.
    ; Return values:
    ; Success: string value of chosen filename, see FileSaveDialog()
    ; Failure: Sets @error to 1
    ; Remarks:
    ; Using hook function you can customize dialog to greater extent - hide/show controls, change text of controls, and do other neat things.
    ; Hook function should have 4 params ($hWnd, $Msg, $wParam, $lParam) and works similar to GuiRegisterMsg() functions. For more information refer http://msdn2.microsoft.com/en-us/library/ms646960(VS.85).aspx
    ; Using custom templates you can add controls to a common dialog. To handle these custom controls, use hook function.
    ;#
    Func _FileSaveDialogEx($sTitle = "", $sInitDir = "", $sFilter = "All Files (*.*)", $iOptions = 0, $sDefaultName = "", $hParent=0, $sHookName="", $hTemplate=0, $sTemplateName="")

    [/autoit] [autoit][/autoit] [autoit]

    Local $sRet = _GetOpenSaveFileName('GetSaveFileName', $sHookName, $hTemplate, $sTemplateName, $hParent, $sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName)
    If @error Then SetError(@error)
    Return $sRet

    EndFunc
    ;###################################
    ;#
    ; _GetOpenSaveFileName()
    ; Internal
    ;#
    Func _GetOpenSaveFileName($sFunction, $sHookProc, $hTemplate, $sTemplateName, $hParent, $sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName)
    Local $taFilters, $tFile, $_OFN_HookProc = 0, $fUnicode = @AutoItUnicode , $iFlagsEx = 0, $iFlagsForced = BitOR($OFN_EXPLORER,$OFN_HIDEREADONLY,$OFN_NODEREFERENCELINKS)
    $iOptions = BitOR($iFlagsForced, $iOptions)
    If BitAND($iOptions, $OFN_EX_NOPLACESBAR) Then
    $iOptions = BitXOR($iOptions, $OFN_EX_NOPLACESBAR)
    $iFlagsEx = $OFN_EX_NOPLACESBAR
    EndIf
    Local $tagBuffer = "char[4096]", $iBufferSize = 4095
    If $fUnicode Then $tagBuffer = "w" & $tagBuffer
    Local $aFilters = StringSplit($sFilter, "|"), $saFilters = "", $tagFilters = "", $aFiltSplit, $i
    For $i = 1 To $aFilters[0]
    $aFiltSplit = StringRegExp($aFilters[$i], "(?U)\A\h*(.+)\h*\((.*)\)", 1)
    $saFilters &= $aFilters[$i] & Chr(0) & $aFiltSplit[1] & Chr(0)
    Next
    $tagFilters = "char[" & StringLen($saFilters)+3 & "]"
    If $fUnicode Then $tagFilters = "w" & $tagFilters
    $taFilters = DllStructCreate($tagFilters)
    DllStructSetData($taFilters, 1, $saFilters)
    Local $tagFileBuffer = "char[32768]", $iFileBufferSize = 32767
    If $fUnicode Then $tagFileBuffer = "w" & $tagFileBuffer
    $tFile = DllStructCreate($tagFileBuffer) ;Win2000/XP: should be 32k for ansi, unlimited for unicode
    If $sDefaultName <> "" Then DllStructSetData($tFile, 1, $sDefaultName)
    $tOFN = DllStructCreate('dword lStructSize;hwnd hwndOwner;hwnd hInstance;' & _
    'ptr lpstrFilter;ptr lpstrCustomFilter;dword nMaxCustFilter;dword nFilterIndex;' & _
    'ptr lpstrFile;dword nMaxFile;ptr lpstrFileTitle;dword nMaxFileTitle;ptr lpstrInitialDir;ptr lpstrTitle;' & _
    'dword Flags;short nFileOffset;short nFileExtension;ptr lpstrDefExt;dword lCustData;ptr lpfnHook;ptr lpTemplateName;' & _
    'dword Reserved[2];dword FlagsEx')
    DllStructSetData($tOFN, 'lStructSize', DllStructGetSize($tOFN))
    If IsHWnd($hParent) Then DllStructSetData($tOFN, 'hwndOwner', $hParent)
    DllStructSetData($tOFN, 'lpstrFilter', DllStructGetPtr($taFilters))
    DllStructSetData($tOFN, 'nFilterIndex', 1)
    DllStructSetData($tOFN, 'lpstrFile', DllStructGetPtr($tFile))
    DllStructSetData($tOFN, 'nMaxFile', $iFileBufferSize)
    DllStructSetData($tOFN, 'FlagsEx', $iFlagsEx)
    If $hTemplate <> 0 Then
    If $sTemplateName <> "" Then
    $iOptions = BitOr($iOptions, $OFN_ENABLETEMPLATE)
    DllStructSetData($tOFN, 'hInstance', $hTemplate)
    Local $tTemplateName = DllStructCreate($tagBuffer);'char[256]')
    DllStructSetData($tTemplateName, 1, $sTemplateName)
    DllStructSetData($tOFN, 'lpTemplateName', DllStructGetPtr($tTemplateName))
    Else
    $iOptions = BitOr($iOptions, $OFN_ENABLETEMPLATEHANDLE)
    DllStructSetData($tOFN, 'hInstance', $hTemplate)
    EndIf
    EndIf
    If $sHookProc <> "" Then
    $iOptions = BitOr($iOptions, $OFN_ENABLEHOOK, $OFN_ENABLEINCLUDENOTIFY)
    $_OFN_HookProc = DllCallbackRegister($sHookProc, "int", "hwnd;uint;wparam;lparam")
    DllStructSetData($tOFN, 'lpfnHook', DllCallbackGetPtr($_OFN_HookProc))
    EndIf
    If $sTitle <> "" Then
    Local $tTitle = DllStructCreate($tagBuffer)
    DllStructSetData($tTitle, 1, String($sTitle))
    DllStructSetData($tOFN, "lpstrTitle", DllStructGetPtr($tTitle))
    EndIf
    If $sInitDir <> "" Then
    Local $tInitDir = DllStructCreate($tagBuffer)
    DllStructSetData($tInitDir, 1, String($sInitDir))
    DllStructSetData($tOFN, "lpstrInitialDir", DllStructGetPtr($tInitDir))
    EndIf
    DllStructSetData($tOFN, 'Flags', $iOptions)
    If $fUnicode Then $sFunction &= 'W'
    Local $aRet = DllCall('comdlg32.dll','int',$sFunction, 'ptr',DllStructGetPtr($tOFN)), $iError = @error
    If $_OFN_HookProc <> 0 Then DllCallbackFree($_OFN_HookProc)
    If $iError Then
    Return SetError(2,$iError,"")
    ElseIf $aRet[0] Then
    Local $iChar = 1
    While $iChar < $iFileBufferSize+1
    If DllStructGetData($tFile, 1, $iChar) = "" Then
    If DllStructGetData($tFile, 1, $iChar+1) = "" Then ExitLoop
    DllStructSetData($tFile, 1, "|", $iChar)
    EndIf
    $iChar += 1
    WEnd
    Return SetError(0,0,DllStructGetData($tFile, 1))
    Else
    Return SetError(1,0,"")
    EndIf
    EndFunc

    [/autoit]
  • Bei mir kommen auch Fehler zb.

    Code
    C:\Users\Simon\Desktop\in.au3 (11) : ==> Can not redeclare a constant.:
    Global Const $OFN_ALLOWMULTISELECT = 0x200
    Global Const ^ ERROR


    ich weis aber nicht wiso

  • Genau das hab ich gemeint @Xenobiologist, Klasse. Danke.

    Ghostbuster

    Naja, doch nicht ganz, denn soweit ich das auf die Schnelle verstanden habe, demonstriert dieses Script, wie man den Dateiauswahldialog von Windows "customizen" kann. Ich möchte aber nicht die Dateiauswahlbox verwenden, sondern die ICON/Vorschau-Ansicht in einem normalen Fenster realisieren und dieses Fenster mit weiteren Funktionen ausstatten, weshalb ich die Dateiauswahlbox leider nicht verwenden kann. Trotzdem Danke für den Tipp. Hast Du eine Idee, wie ich das realisieren kann?

    Danke, Ghostbuster

    • Offizieller Beitrag

    Hi,

    hier noch ein Ansatz

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GuiListView.au3>
    #include <GuiTreeView.au3>
    #include <Misc.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <StaticConstants.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIDataSeparatorChar","\")

    [/autoit] [autoit][/autoit] [autoit]

    WinActivate('Ordneroptionen')
    $text = ControlGetText('Ordneroptionen', '', 30120)
    $htree = ControlGetHandle('Ordneroptionen', '', 30120)
    If IsHWnd($htree) Then ConsoleWrite("Yeah" & @CRLF)
    ;ConsoleWrite(_GUICtrlTreeView_GetTree ($htree, 1) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($text & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Autoit3Ex.au3 v 0_16
    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.1.1.73
    ; Author: Holger Kotsch
    ; Version: 1.1
    ;
    ; Script Function:
    ; Unfinished Explorer-like sample (Preview)
    ;
    ; !!! Self-API-created items are not supported !!!
    ;
    ; ----------------------------------------------------------------------------
    #region declares
    ; TV functions
    global $TotalRows=34, $nMsg,$down,$szPath,$current
    Global Const $TV2M_INSERTITEM = $TV_FIRST + 0
    Global Const $TV2M_GETITEMRECT = $TV_FIRST + 4
    Global Const $TV2M_SETIMAGELIST = $TV_FIRST + 9
    Global Const $TV2M_SETITEM = $TV_FIRST + 13
    Global Const $TV2M_HITTEST = $TV_FIRST + 17
    Global Const $TV2I_FIRST = 0xFFFF0001
    ; Masks
    Global Const $TV2IF_IMAGE = 0x0002
    Global Const $TV2IF_HANDLE = 0x0010
    Global Const $TV2IF_SELECTEDIMAGE = 0x0020
    Global Const $TV2IF_CHILDREN = 0x0040
    ; States
    Global Const $TV2IS_CUT = 0x0004
    Global Const $TV2IS_DROPHILITED = 0x0008
    Global Const $TV2IS_BOLD = 0x0010
    Global Const $TV2IS_EXPANDED = 0x0020
    ; Relationship/specific item
    Global Const $TV2GN_ROOT = 0x0000
    Global Const $TV2GN_PREVIOUS = 0x0002
    Global Const $TV2GN_FIRSTVISIBLE = 0x0005
    Global Const $TV2GN_NEXTVISIBLE = 0x0006
    Global Const $TV2GN_PREVIOUSVISIBLE = 0x0007
    Global Const $TV2GN_DROPHILITE = 0x0008
    ; Hittest infos
    Global Const $TV2HT_NOWHERE = 0x0001
    Global Const $TV2HT_ONITEMICON = 0x0002
    Global Const $TV2HT_ONITEMLABEL = 0x0004
    Global Const $TV2HT_ONITEMINDENT = 0x0008
    Global Const $TV2HT_ONITEMBUTTON = 0x0010
    Global Const $TV2HT_ONITEMRIGHT = 0x0020
    Global Const $TV2HT_ONITEMSTATEICON = 0x0040
    Global Const $TV2HT_ONITEM = BitOr($TV2HT_ONITEMICON, $TV2HT_ONITEMLABEL, $TV2HT_ONITEMSTATEICON)
    Global Const $TV2HT_ABOVE = 0x0100
    Global Const $TV2HT_BELOW = 0x0200
    Global Const $TV2HT_TORIGHT = 0x0400
    Global Const $TV2HT_TOLEFT = 0x0800
    ;If Not IsDeclared("LVM_SETEXTENDEDLISTVIEWSTYLE") Then Global Const $LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1036
    If Not IsDeclared("LVM_SETCOLUMN") Then Global Const $LVM_SETCOLUMN = 0x101A
    ;If Not IsDeclared("LVCF_FMT") Then Global Const $LVCF_FMT = 0x0001
    ;If Not IsDeclared("LVCFMT_RIGHT") Then Global Const $LVCFMT_RIGHT = 0x0001
    ;If Not IsDeclared("LVM_GETHEADER") Then Global Const $LVM_GETHEADER = 0x101F
    Global $nCtrls = 0
    Global $hCurItem = 0
    Global $hImageList = 0
    Global $szDirType = RegRead("HKCR\Directory", "")
    If $szDirType = "" Then $szDirType = "Directory"
    ;$indexingGUI = GUICreate("Sorry.. Finding Folder structure!", 300, 50, (@DesktopWidth - 300) / 2, (@DesktopHeight - 50) / 2)
    ;$indexingLabel=GUICtrlCreateLabel("Sorry..Only time you'll have to wait! Please Wait...", 30, 1, 250, 25)
    ;$indexstatuslabel = GUICtrlCreateLabel("", 20, 25, 280, 20)
    ;GUISetState()
    $hGui = GUICreate("AutoIt3-Explorer V1.1a ;-)", 762, 578, -1, -1, BitOr($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
    $nFileMenu = GUICtrlCreateMenu("&File")
    $editMenu = GUICtrlCreateMenu("&Edit")
    $nViewMenu = GUICtrlCreateMenu("&View")
    $nViewItem1 = GUICtrlCreateMenuItem("Icons", $nViewMenu, -1, 1)
    $nViewItem2 = GUICtrlCreateMenuItem("Report", $nViewMenu, -1, 1)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $nViewItem3 = GUICtrlCreateMenuItem("Small Icons", $nViewMenu, -1, 1)
    $nViewItem4 = GUICtrlCreateMenuItem("List", $nViewMenu, -1, 1)
    $nExtraMenu = GUICtrlCreateMenu("E&xtra")
    $nHelpMenu = GUICtrlCreateMenu("&?")
    $nExitItem = GUICtrlCreateMenuItem("Exit",$nFileMenu)
    $nAboutItem = GUICtrlCreateMenuItem("About",$nHelpMenu)
    GUICtrlCreateLabel("", 0, 0, 800, 2, BitOr($SS_SUNKEN, $SS_BLACKRECT))
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    GUICtrlCreateLabel("Address", 5, 5, 50, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
    $nAddressbar = GUICtrlCreateCombo("C:\", 50, 3, 300, 20)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    $Tab1combo1 = GUICtrlCreateCombo("# Rows", 400, 3, 50, 30);, $CBS_SIMPLE)
    GUICtrlSetData(-1, "10|20|34|50|100|150|300|500|1000|1200|1500|2000|3000|4000", "34") ;Set default 10
    GUICtrlCreateLabel("Rows",360, 3)
    $TopButton = GuiCtrlCreateButton("|<", 460, 3 ,30, 20)
    GUICtrlSetTip($TopButton,"$TopButton")
    $UpButton = GuiCtrlCreateButton("<", 500, 3, 30, 20)
    GUICtrlSetTip($UpButton,"$UpButton")
    GUICtrlCreateLabel("Pg Up", 580, 6,35,15)
    $updown = GUICtrlCreateInput("0", 540, 3, 35, 20)
    $UpOneScreen = GUICtrlCreateUpdown($updown)
    GUICtrlSetTip($UpOneScreen, "$UpOneScreen")
    $DownButton = GuiCtrlCreateButton(">", 620, 3, 30, 20)
    GUICtrlSetTip($DownButton,"$DownButton")
    $Bottom = GuiCtrlCreateButton(">|", 660, 3, 30, 20)
    GUICtrlSetTip($Bottom,"$Bottom")
    ;GUICtrlCreateLabel("Dn", 680, 3)
    ;$down = GUICtrlCreateInput("0", 580, 3, 35, 20)
    ;$down = GUICtrlCreateInput("0", 540, 540, 150, 18)
    ;$DownOneScreen = GUICtrlCreateUpdown($down)
    ;GUICtrlSetTip($DownOneScreen, "$DownOneScreen")
    $Value = GUICtrlCreateCombo("0", 700, 3, 55, 20);, $CBS_SIMPLE)
    GUICtrlCreateLabel("Num row", 780, 3)
    GUICtrlSetTip($Value, "Show Control cursor, hold cursor for sample label")
    $arDrives = DriveGetDrive("ALL")
    $nTreeView = GUICtrlCreateTreeView(0, 25, 310, 513, -1, $WS_EX_CLIENTEDGE)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH)
    GUICtrlSetState(-1, $GUI_FOCUS)
    GUICtrlSetImage(-1, "shell32.dll", 3, 4) ;
    GUICtrlSetImage(-1, "shell32.dll", 4, 2) ;
    GUICtrlSetImage(-1, "shell32.dll", 7) ; Removable
    GUICtrlSetImage(-1, "shell32.dll", 8) ; Fixed
    GUICtrlSetImage(-1, "shell32.dll", 9) ; Network
    GUICtrlSetImage(-1, "shell32.dll", 11) ; CD-ROM
    $nListView = GUICtrlCreateListView("Name|Size|Type|Changed|No.",314, 25, 447, 513)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
    GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlListView_SetColumnFormat($nListView, 1, $LVCFMT_RIGHT)
    GUICtrlListView_SetColumnFormat($nListView, 4, $LVCFMT_RIGHT)
    GUICtrlSetImage(-1, "shell32.dll", 0)
    $statusbarobj = GUICtrlCreateLabel(" Object(s)",0, 540, 150, 18, $SS_SUNKEN)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
    $statusbarsize = GUICtrlCreateLabel(" MB (Free Space: 0 MB)", 152, 540, 610, 18, $SS_SUNKEN)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
    ;$down = GUICtrlCreateInput("0", 540, 540, 35, 20)
    $down = GUICtrlCreateLabel("0", 540, 544,35,13)
    $DownOneScreen = GUICtrlCreateUpdown($down)
    GUICtrlSetTip($DownOneScreen, "$DownOneScreen")
    GUICtrlCreateLabel("Pg Dn", 580, 544,45,13)
    $nSplitter = GUICtrlCreateLabel("", 310, 29, 4, 509)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH)
    GUICtrlSetCursor(-1, 13)
    GUICtrlSetData($Tab1combo1,$TotalRows)
    GUISetState(@SW_SHOW, $hGui)
    FillTreeRoot($arDrives)
    _GUICtrlListView_SetColumnWidth ($nListView, 0, 180) ;Set Column with
    _GUICtrlListView_SetColumnWidth ($nListView, 4, 20) ;Set Column with
    UpdateWindow($nTreeView)
    $nFirstItem = 0
    $nLastItem = 0
    $nOldItem = 0
    DirToList("C:")
    $szCurrentPath = "C:"
    $szOldPath = ""
    $curx = 0
    $curpressed = 0
    $splitx1 = 48
    $splitx2 = 52
    $savex = 310
    $pressed = 0
    #endregion declares
    While 1
    $nMsg = GUIGetMsg()
    $arInfo = GUIGetCursorInfo()
    If $pressed = 1 And $arInfo[2] = 0 Then $pressed = 0
    If $pressed = 1 And $arInfo[2] = 1 Then
    $arPos = WinGetPos($hGui)
    If $arInfo[0] > 100 And $arInfo[0] < $arPos[2] - 100 Then
    If $arInfo[0] <> $savex Then
    ControlMove($hGui, "", $nSplitter, $arInfo[0] - 2, 29)
    ControlMove($hGui, "", $nTreeView, 0, 25, $arInfo[0] - 2)
    ControlMove($hGui, "", $nListView, $arInfo[0] + 2, 25, $arPos[2] - $arInfo[0] - 10)
    $savex = $arInfo[0]
    EndIf
    EndIf
    EndIf
    If $arInfo[4] = $nTreeView And $arInfo[2] And WinActive($hGui) Then
    $nFlag = 0
    $hItem = TV_Hittest($nTreeView, $nFlag)
    If BitAnd($nFlag, $TV2HT_ONITEMBUTTON) Or BitAnd($nFlag, $TV2HT_ONITEM) Then
    GUISetState(@SW_LOCK)
    CheckTreeFill($nTreeView, $hItem)
    GUISetState(@SW_UNLOCK)
    GUICtrlSetData($nAddressbar, GetTreePath($nTreeView, $hItem, "\"))
    EndIf
    $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
    $szCurrentPath = GetTreePath($nTreeView, $hItem, "\")
    If BitAnd($nFlag, $TV2HT_ONITEM) Then GUICtrlSetData($nAddressbar, $szCurrentPath)
    If $szOldPath <> $szCurrentPath Then
    $szOldPath = $szCurrentPath
    GUISetState(@SW_LOCK)
    For $i = $nFirstItem To $nLastItem
    GUICtrlDelete($i)
    Next
    GUISetState(@SW_UNLOCK)
    ;UpdateCtrl($hGui, $nListView)
    $nFirstItem = 0
    $nLastItem = 0
    $nOldItem = 0
    GUICtrlSetData($nAddressbar, $szCurrentPath)
    GUICtrlSetCursor($nListView,1)
    GUICtrlSetCursor($nTreeView,1)
    DirToList($szCurrentPath)
    GUICtrlSetCursor($nListView,2)
    GUICtrlSetCursor($nTreeView,2)
    EndIf
    ElseIf _IsPressed("6B") And ControlGetFocus($hGui) = "SysTreeView321" Then
    $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CARET, 0)
    CheckTreeFill($nTreeView, $hItem)
    EndIf
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYDOWN
    $pos = GUIGetCursorInfo()
    If ($pos[4] == $nListView) Then
    If ($current <> _GUICtrlListView_GetHotItem ($nListView) And _GUICtrlListView_GetHotItem ($nListView) >= 0) Then
    ;msgbox("", "Hot Item:" , _GUICtrlListView_GetHotItem ($searchlistView))
    $current = _GUICtrlListView_GetHotItem ($nListView)
    ;msgbox(0,"",_GUICtrlListView_GetItemText($searchlistView, $current, 1))
    ElseIf ($current = _GUICtrlListView_GetHotItem ($nListView) And _GUICtrlListView_GetHotItem ($nListView) >= 0) Then
    $s_NewPath=GUICtrlRead($nAddressbar)&_GUICtrlListView_GetItemText ($nListView, $current, 0)
    if not StringInStr($s_NewPath, ".") then $s_NewPath&="\"
    Run("explorer.exe /select, " & $s_NewPath , "", @SW_MAXIMIZE)
    ElseIf (_GUICtrlListView_GetHotItem ($nListView == -1)) Then
    ;msgbox("", "Hot Item:" , "None")
    EndIf
    EndIf
    Case $GUI_EVENT_CLOSE, $nExitItem
    ExitLoop
    Case $nAboutItem
    Msgbox(64,"About","Demo by Holger; modified display by Randallc")
    Case $nSplitter
    $cinfo = GUIGetCursorInfo()
    If $cinfo[2] = 1 Then $pressed = 1
    Case $nViewItem1 To $nViewItem4
    GUICtrlSetStyle($nListView, BitOr($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $nMsg - $nViewItem1))
    Case $updown
    ;MsgBox(0,"","$updown="&$nMsg)
    $i_UpRead=Number(GUICtrlRead($updown))
    $i_OldUpRead=-Number(GUICtrlRead($down))
    $nMsg = $updown
    Re_List($szPath)
    Case $UpButton
    ;MsgBox(0,"","$UpButton="&$nMsg)
    GUICtrlSetData($updown,Number(GUICtrlRead($updown))+1)
    $i_UpRead=Number(GUICtrlRead($updown))
    $i_OldUpRead=-Number(GUICtrlRead($down))
    $nMsg = $updown
    Re_List($szPath)
    Case $TopButton
    ;MsgBox(0,"","$TopButton="&$nMsg)
    GUICtrlSetData($updown,0)
    GUICtrlSetData($down,0)
    GUICtrlSetData($Value,0)
    $i_UpRead=Number(GUICtrlRead($updown))
    $i_OldUpRead=-Number(GUICtrlRead($down))
    $nMsg = $updown
    Re_List($szPath)
    GUICtrlSetData($down,0)
    GUICtrlSetData($Updown,0)
    Case $down
    ; MsgBox(0,"","$down="&$nMsg)
    $i_DownRead=Number(GUICtrlRead($down))
    $i_OldDownRead=-Number(GUICtrlRead($updown))
    if $nMsg<> $Bottom then GUICtrlSetData($down,_iif($i_DownRead<$i_OldDownRead,$i_DownRead+2,$i_DownRead-2))
    $nMsg = $down
    Re_List($szPath)
    Case $DownButton
    ;MsgBox(0,"","$DownButton="&$nMsg)
    GUICtrlSetData($down,Number(GUICtrlRead($down))-1)
    GUICtrlSetData($updown,Number(GUICtrlRead($updown))-1)
    $i_DownRead=Number(GUICtrlRead($down))
    $i_OldDownRead=-Number(GUICtrlRead($updown))
    if $nMsg<> $Bottom then GUICtrlSetData($down,_iif($i_DownRead<$i_OldDownRead,$i_DownRead+2,$i_DownRead-2))
    $nMsg = $down
    Re_List($szPath)
    Case $Bottom
    ;MsgBox(0,"","$Bottom="&$nMsg)
    GUICtrlSetData($down,0)
    GUICtrlSetData($Updown,0)
    GUICtrlSetData($Value,$TotalRows)
    $i_DownRead=Number(GUICtrlRead($down))
    $i_OldDownRead=-Number(GUICtrlRead($updown))
    if $nMsg<> $Bottom then GUICtrlSetData($down,_iif($i_DownRead<$i_OldDownRead,$i_DownRead+2,$i_DownRead-2))
    $nMsg = $down
    Re_List($szPath)
    GUICtrlSetData($down,0)
    GUICtrlSetData($Updown,0)
    Case $Tab1combo1 ,$Value , $updown , $down
    ;MsgBox(0,"","many="&$nMsg)
    ;MsgBox(0,"","$Value="&$nMsg)
    ;MsgBox(0,"","$Tab1combo1="&$nMsg)
    ;MsgBox(0,"","$down="&$nMsg)
    ;MsgBox(0,"","$updown="&$nMsg)
    Re_List($szPath)
    EndSwitch
    WEnd
    Func CheckTreeFill($nCtrl, $hItem)
    If $hItem > 0 Then
    $hChild = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem)
    If $hChild > 0 Then
    $szText = GetItemText($nTreeView, $hChild)
    If $szText == "" Then
    $szPath = GetTreePath($nTreeView, $hItem, "\")
    If StringRight($szPath, 1) == "\" Then $szPath = StringTrimRight($szPath, 1)
    GUICtrlSetCursor($nTreeView, 1)
    FillTree($szPath, $hItem, $hChild)
    GUICtrlSetCursor($nTreeView, 2)
    EndIF
    EndIf
    EndIf
    EndFunc ;==>CheckTreeFill
    Func FillTreeRoot($arDrives)
    Local $hSearch, $szFile, $nChildren, $szDriveLabel
    $hParent = 0
    For $i = 1 To $arDrives[0]
    $nChildren = 0
    ;MsgBox(0,"",$arDrives[$i])
    $s_Directories=@ScriptDir&"\Dir_"&StringLower(StringLeft($arDrives[$i],1))&".txt"
    ;FileDelete($s_Directories)
    filemove(@ScriptDir&"\Dir_*.*",@ScriptDir&"\backup\",9)
    If GetSubFolder($arDrives[$i]) Then $nChildren = 1
    $szType = DriveGetType($arDrives[$i])
    Switch $szType
    Case "Removable"
    $iImage = 2
    $iSelectedImage = 2
    Case "Fixed"
    $iImage = 3
    $iSelectedImage = 3
    Case "Network"
    $iImage = 4
    $iSelectedImage = 4
    Case "CDROM"
    $iImage = 5
    $iSelectedImage = 5
    Case Else
    $iImage = 0
    $iSelectedImage = 0
    EndSwitch
    If $szType = "Removable" Then
    $szText = "Removable"
    ElseIf $szType = "Network" Then
    $szLabel = DriveMapGet($arDrives[$i])
    $nPos = StringInStr($szLabel, "\", 0, -1)
    $szText = StringRight($szLabel, StringLen($szLabel) - $nPos) & " on """ & StringTrimLeft(StringLeft($szLabel, $nPos - 1), 2) & """"
    Else
    $szText = DriveGetLabel($arDrives[$i])
    EndIf
    $szDriveLabel = $szText & " (" & StringUpper($arDrives[$i]) & ")"
    $hItem = InsertItem($szDriveLabel, $hParent, $hCurItem, $nChildren, $iImage, $iSelectedImage)
    If $nChildren = 1 Then InsertDummyItem($nTreeView, $hItem)
    Next
    $hItem = GUICtrlSendMsg($nTreeView, $TVM_GETNEXTITEM, $TV2GN_ROOT, 0)
    GUICtrlSendMsg($nTreeView, $TVM_SELECTITEM, $TVGN_CARET, $hItem)
    EndFunc ;==>FillTreeRoot
    Func GetSubFolder($szPath)
    Local $hSearch, $szFile, $nChildren = 0
    $hSearch = FileFindFirstFile($szPath & "\*.*")
    If $hSearch = -1 Then Return
    While 1
    $szFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($szPath & "\" & $szFile), "D") Then
    $nChildren = 1
    ExitLoop
    EndIf
    WEnd
    FileClose($hSearch)
    Return $nChildren
    EndFunc ;==>GetSubFolder
    Func FillTree($szPath, $hParent = 0, $hDelete = 0)
    Local $hSearch, $szFile, $nChildren,$s_DirExist,$s_Directories
    If $hDelete > 0 Then
    GUICtrlSendMsg($nTreeView, $TVM_DELETEITEM, 0, $hDelete)
    SetItemChildren($hParent)
    EndIf
    local $s_AnswerFile=@ScriptDir & '\au3.txt',$s_AnswerFile2=@ScriptDir & '\au32.txt'
    $s_Switches1=" /ad /b "
    $s_Switches2=" /ad /b/s "
    $szPath=FileGetShortName($szPath)
    If (StringRight($szPath, 1) == "\") Then $szPath = StringTrimRight($szPath, 1)
    if not (StringRight($szPath, 1) == ":") Then
    ;$nPos = StringInStr($szPath, "\", 0, 2)
    ;$szPathBase=StringLeft($szPath,$nPos-1)
    ;if (StringRight($szPathBase, 1) == ":") or $nPos=0 Then $szPathBase=$szPath
    $szPathBase=$szPath
    $szPathBaseName=StringReplace(StringReplace(StringLower($szPathBase),":","_"),"\","_")
    $s_Directories=@ScriptDir&"\Dir_"&$szPathBaseName&".txt"
    if not FileExists($s_Directories) then
    $s_DirExist=0
    Else
    $s_DirExist=1
    EndIf
    EndIf
    $s_Command= ' dir ' & $szPath & '\* '&$s_Switches1 & ' > "' & $s_AnswerFile&'"'
    ;if not $s_DirExist=1 then $s_Command&= ' |dir ' & $szPath & '\* '&$s_Switches2 & ' > "' & $s_Directories&'"'
    RunWait(@ComSpec & ' /c ' & $s_Command, '', @SW_HIDE)
    if not StringRight($szPath, 1) = ":" Then
    ;MsgBox(0,"","StringRight($szPath, 1)="&StringRight($szPath, 1))
    ;MsgBox(0,"","so $s_Directories="&$s_Directories)
    $s_DirString=FileRead($s_Directories,FileGetSize($s_Directories))
    $s_DirExist=1
    EndIf
    $hSearch = FileOpen($s_AnswerFile,0)
    While 1
    $szFile=FileReadLine($hSearch)
    If @error = -1 Then ExitLoop
    $nChildren = 0
    if not StringRight($szPath, 1) = ":" and $s_DirExist=1 Then
    ;MsgBox(0,"","StringRight($szPath, 1)="&StringRight($szPath, 1))
    ;MsgBox(0,"","so $s_Directories="&$s_Directories)
    if StringInStr($s_DirString,StringReplace(StringReplace($szPath & "\" & $szFile,"\","_"),":","_")) Then $nChildren = 1
    Else
    If GetSubFolder($szPath & "\" & $szFile) Then $nChildren = 1
    EndIf
    $hItem = InsertItem($szFile, $hParent, $hCurItem, $nChildren)
    If $nChildren = 1 Then InsertDummyItem($nTreeView, $hItem)
    $nCtrls = $nCtrls + 1
    WEnd
    FileClose($hSearch)
    EndFunc ;==>FillTree
    Func FillTreeOld($szPath, $hParent = 0, $hDelete = 0)
    Local $hSearch, $szFile, $nChildren,$s_DirExist,$s_Directories
    If $hDelete > 0 Then
    GUICtrlSendMsg($nTreeView, $TVM_DELETEITEM, 0, $hDelete)
    SetItemChildren($hParent)
    EndIf
    local $s_AnswerFile=@ScriptDir & '\au3.txt',$s_AnswerFile2=@ScriptDir & '\au32.txt'
    $s_Switches1=" /ad /b "
    $s_Switches2=" /ad /b/s "
    $szPath=FileGetShortName($szPath)
    If (StringRight($szPath, 1) == "\") Then $szPath = StringTrimRight($szPath, 1)
    if not (StringRight($szPath, 1) == ":") Then
    $nPos = StringInStr($szPath, "\", 0, 2)
    $szPathBase=StringLeft($szPath,$nPos-1)
    if (StringRight($szPathBase, 1) == ":") or $nPos=0 Then $szPathBase=$szPath
    $szPathBaseName=StringReplace(StringReplace(StringLower($szPathBase),":","_"),"\","_")
    $s_Directories=@ScriptDir&"\Dir_"&$szPathBaseName&".txt"
    if not FileExists($s_Directories) then
    $s_DirExist=0
    Else
    $s_DirExist=1
    EndIf
    EndIf
    $s_Command= ' dir ' & $szPath & '\* '&$s_Switches1 & ' > "' & $s_AnswerFile&'"'
    if not $s_DirExist=1 then $s_Command&= ' |dir ' & $szPath & '\* '&$s_Switches2 & ' > "' & $s_Directories&'"'
    RunWait(@ComSpec & ' /c ' & $s_Command, '', @SW_HIDE)
    if not StringRight($szPath, 1) = ":" Then
    ;MsgBox(0,"","StringRight($szPath, 1)="&StringRight($szPath, 1))
    ;MsgBox(0,"","so $s_Directories="&$s_Directories)
    $s_DirString=FileRead($s_Directories,FileGetSize($s_Directories))
    $s_DirExist=1
    EndIf
    $hSearch = FileOpen($s_AnswerFile,0)
    While 1
    $szFile=FileReadLine($hSearch)
    If @error = -1 Then ExitLoop
    $nChildren = 0
    if not StringRight($szPath, 1) = ":" and $s_DirExist=1 Then
    ;MsgBox(0,"","StringRight($szPath, 1)="&StringRight($szPath, 1))
    ;MsgBox(0,"","so $s_Directories="&$s_Directories)
    if StringInStr($s_DirString,StringReplace(StringReplace($szPath & "\" & $szFile,"\","_"),":","_")) Then $nChildren = 1
    Else
    If GetSubFolder($szPath & "\" & $szFile) Then $nChildren = 1
    EndIf
    $hItem = InsertItem($szFile, $hParent, $hCurItem, $nChildren)
    If $nChildren = 1 Then InsertDummyItem($nTreeView, $hItem)
    $nCtrls = $nCtrls + 1
    WEnd
    FileClose($hSearch)
    EndFunc ;==>FillTree
    Func InsertItem($szText, $hParent, $hInsertAfter, $nChildren, $iImage = 0, $iSelectedImage = 1)
    $pszText = DllStructCreate("char[260]")
    DllStructSetData($pszText, 1, $szText)
    $tvItem = TVITEM()
    $tvInsertStruct = DllStructCreate("int;int;int[10]")
    If $hCurItem = 0 Then
    $hInsertAfter = $TV2I_FIRST
    Else
    $hInsertAfter = $hCurItem
    EndIf
    DllStructSetData($tvInsertStruct, 1, $hParent)
    DllStructSetData($tvInsertStruct, 2, $hInsertAfter)
    DllStructSetData($tvInsertStruct, 3, $tvItem)
    $hItem = GUICtrlSendMsg($nTreeView, $TV2M_INSERTITEM, 0, DllStructGetPtr($tvInsertStruct))
    If $hItem > 0 Then
    $hCurItem = $hItem
    DllStructSetData($tvItem, 1, BitOr($TVIF_TEXT, $TV2IF_IMAGE, $TV2IF_SELECTEDIMAGE))
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 5, DllStructGetPtr($pszText))
    DllStructSetData($tvItem, 7, $iImage)
    DllStructSetData($tvItem, 8, $iSelectedImage)
    GUICtrlSendMsg($nTreeView, $TV2M_SETITEM, 0, DllStructGetPtr($tvItem))
    EndIf
    ;;DllStructDelete($tvInsertStruct)
    ;;DllStructDelete($tvItem)
    ;;DllStructDelete($pszText)
    Return $hItem
    EndFunc ;==>InsertItem
    Func InsertDummyItem($nCtrl, $hItem)
    InsertItem("", $hItem, $hCurItem, 0)
    EndFunc ;==>InsertDummyItem
    Func TV_Hittest($nCtrl, ByRef $nFlag )
    $hItem = 0
    $point = DllStructCreate("int;int")
    DllCall("user32.dll", "int", "GetCursorPos", "ptr", DllStructGetPtr($point))
    $hWnd = ControlGetHandle("", "", $nCtrl)
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($point))
    $tvHit = DllStructCreate("int[2];uint;int")
    DllStructSetData($tvHit, 1, DllStructGetData($point, 1), 1)
    DllStructSetData($tvHit, 1, DllStructGetData($point, 2), 2)
    If GUICtrlSendMsg($nCtrl, $TV2M_HITTEST, 0, DllStructGetPtr($tvHit)) Then
    $nFlag = DllStructGetData($tvHit, 2)
    $hItem = DllStructGetData($tvHit, 3)
    EndIf
    ;DllStructDelete($tvHit)
    ;DllStructDelete($point)
    Return $hItem
    EndFunc ;==>TV_Hittest
    Func ItemHasChildren($nCtrl, $hItem)
    $nChildren = 0
    If GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem) > 0 Then $nChildren = 1
    Return $nChildren
    EndFunc ;==>ItemHasChildren
    Func ExpandTree($nCtrl, $hItem)
    $result = GUICtrlSendMsg($nCtrl, $TVM_EXPAND, 0x0002, $hItem)
    EndFunc ;==>ExpandTree
    Func GetTreePath($nCtrl, $hItem, $szSepChar)
    Local $szPath = "", $hParent, $hWnd, $szText
    While $hItem > 0
    $szText = GetItemText($nCtrl, $hItem)
    $hParent = GUICtrlSendMsg($nCtrl, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem)
    If $hParent = 0 Then $szText = StringRight(StringTrimRight($szText, 1), 2)
    $szPath = $szText & $szSepChar & $szPath
    $hItem = $hParent
    WEnd
    Return $szPath
    EndFunc ;==>GetTreePath
    Func GetItemText($nCtrl, $hItem)
    Local $szText = "", $pszText, $tvItem
    $pszText = DllStructCreate("char[260]")
    $tvItem = TVITEM()
    DllStructSetData($tvItem, 1, $TVIF_TEXT)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 5, DllStructGetPtr($pszText))
    DllStructSetData($tvItem, 6, 260)
    GUICtrlSendMsg($nTreeView, $TVM_GETITEM, 0, DllStructGetPtr($tvItem))
    $szText = DllStructGetData($pszText, 1)
    ;DllStructDelete($tvItem)
    ;DllStructDelete($pszText)
    Return $szText
    EndFunc ;==>GetItemText
    Func GetItemState($nCtrl, $hItem)
    Local $nState = 0, $tvItem
    $tvItem = TVITEM()
    DllStructSetData($tvItem, 1, $TVIF_STATE)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 4, $TVIS_STATEIMAGEMASK)
    GUICtrlSendMsg($nTreeView, $TVM_GETITEM, 0, DllStructGetPtr($tvItem))
    $nState = DllStructGetData($tvItem, 3)
    ;DllStructDelete($tvItem)
    Return $nState
    EndFunc ;==>GetItemState
    Func TVITEM()
    Return DllStructCreate("uint;int;uint;uint;ptr;int;int;int;int;int")
    EndFunc ;==>TVITEM
    Func UpdateWindow($nCtrl)
    $hWnd = ControlGetHandle("", "", $nCtrl)
    $rect = DllStructCreate("int;int;int;int")
    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "int", 0, "int", 0)
    EndFunc ;==>UpdateWindow
    Func SetItemChildren($hItem, $nFlag = 1)
    Local $tvItem
    $tvItem = TVITEM()
    DllStructSetData($tvItem, 1, $TV2IF_CHILDREN)
    DllStructSetData($tvItem, 2, $hItem)
    DllStructSetData($tvItem, 9, $nFlag)
    GUICtrlSendMsg($nTreeView, $TV2M_SETITEM, 0, DllStructGetPtr($tvItem))
    ;DllStructDelete ($tvItem)
    EndFunc ;==>SetItemChildren
    Func FileGetIconCount($szFile)
    Dim $nCount = 0;
    ;redim $szFile
    $LPCTSTR = DllStructCreate("char[260]")
    DllStructSetData($LPCTSTR, 1, $szFile)
    $nCount = DllCall("shell32.dll", "int", "ExtractIconEx", "ptr", DllStructGetPtr($LPCTSTR), "int", -1, "int", 0, "int", 0, "int", 0)
    $nCount = $nCount[0]
    ;DllStructDelete($LPCTSTR)
    Return $nCount
    EndFunc ;==>FileGetIconCount
    Func FileGetType($szFile)
    Dim $szRegDefault = "", $szRegType = ""
    ;redim $szFile
    $szExt = StringRight($szFile,4)
    $szRegDefault = RegRead("HKCR\" & $szExt,"")
    If $szRegDefault <> "" Then $szRegType = RegRead("HKCR\" & $szRegDefault,"")
    If $szRegType = "" Then $szRegType = $szExt & "-File"
    Return $szRegType
    EndFunc ;==>FileGetType
    Func FileGetIcon(ByRef $szIconFile, ByRef $nIcon, $szFile)
    Dim $szRegDefault = "", $szDefIcon = ""
    ;redim $szFile
    ;$nIcon = 0
    $szExt = StringRight($szFile,4)
    $szRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $szExt,"ProgID")
    If $szRegDefault = "" Then $szRegDefault = RegRead("HKCR\" & $szExt,"")
    If $szRegDefault <> "" Then $szDefIcon = RegRead("HKCR\" & $szRegDefault & "\DefaultIcon","")
    If $szDefIcon = "" Then
    $szIconFile = "shell32.dll"
    ElseIf $szDefIcon <> "%1" Then
    $arSplit = StringSplit($szDefIcon,",")
    If IsArray($arSplit) Then
    $szIconFile = $arSplit[1]
    If $arSplit[0] > 1 Then $nIcon = $arSplit[2]
    Else
    Return 0
    EndIf
    EndIf
    Return 1
    EndFunc ;==>FileGetIcon
    Func GUICtrlListView_SetColumnFormat($hListView, $nCol, $nFormat)
    $hListViewHeader = GUICtrlSendMsg($hListView, $LVM_GETHEADER, 0, 0)
    $LVCOLUMN = DllStructCreate("uint;int;int;ptr;int;int;int;int")
    DllStructSetData($LVCOLUMN, 1, $LVCF_FMT)
    DllStructSetData($LVCOLUMN, 2, $nFormat)
    GUICtrlSendMsg($hListView, $LVM_SETCOLUMN, $nCol, DllStructGetPtr($LVCOLUMN))
    ;;DllStructDelete($LVCOLUMN)
    EndFunc ;==>GUICtrlListView_SetColumnFormat
    Func UpdateCtrl($hWnd, $nCtrl)
    $hCtrl = ControlGetHandle($hWnd, "", $nCtrl)
    $point = DllStructCreate("int;int")
    $rect = DllStructCreate("int;int;int;int")
    DllCall("user32.dll", "int", "GetWindowRect", "hwnd", $hCtrl, "ptr", DllStructGetPtr($rect))
    DllStructSetData($point, 1, DllStructGetData($rect, 1))
    DllStructSetData($point, 2, DllStructGetData($rect, 2))
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hCtrl, "ptr", DllStructGetPtr($point))
    DllStructSetData($rect, 1, DllStructGetData($point, 1))
    DllStructSetData($rect, 2, DllStructGetData($point, 2))
    DllStructSetData($point, 1, DllStructGetData($rect, 3))
    DllStructSetData($point, 2, DllStructGetData($rect, 4))
    DllCall("user32.dll", "int", "ScreenToClient", "hwnd", $hCtrl, "ptr", DllStructGetPtr($point))
    DllStructSetData($rect, 3, DllStructGetData($point, 1))
    DllStructSetData($rect, 4, DllStructGetData($point, 2))
    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", DllStructGetPtr($rect), "int", 1);
    ;DllStructDelete($point)
    ;DllStructDelete($rect)
    EndFunc ;==>UpdateCtrl
    Func DirToList($szPath)
    $s_MsgValue=GUICtrlRead($Value)
    local $s_AnswerFile=@ScriptDir & '\au3.txt',$s_AnswerFile2=@ScriptDir & '\au32.txt'
    $s_Switches1=" /ad /b "
    $s_Switches2=" /a-d /b "
    $szPath=FileGetShortName($szPath)
    If StringRight($szPath, 1) = "\" Then $szPath = StringTrimRight($szPath, 1)
    $s_Command= ' dir ' & $szPath & '\* '&$s_Switches1 & ' > "' & $s_AnswerFile&'"'& _
    '|dir ' & $szPath & '\* '&$s_Switches2 & ' > "' & $s_AnswerFile2 &'"'
    RunWait(@ComSpec & ' /c ' & $s_Command, '', @SW_HIDE)
    $s_StringAns=FileRead($s_AnswerFile,FileGetSize($s_AnswerFile))&FileRead($s_AnswerFile2,FileGetSize($s_AnswerFile2))
    $file = FileOpen($s_AnswerFile, 2)
    FileWrite($file,$s_StringAns)
    FileClose($file)
    $sTXTLOGFile2="Table.txt"
    Dim $hSearch, $szFile, $szDate, $szType, $nItem
    If StringRight($szPath, 1) = "\" Then $szPath = StringTrimRight($szPath, 1)
    $hSearch = FileOpen($s_AnswerFile,0)
    $nItem = -1
    $i_numItems=0
    ;====================================================CountRows
    $TotalRows=_FileCountLines( $s_AnswerFile )
    $s_IntervalString=""
    $i_IntervalCombo=$TotalRows/20
    for $i=0 to 20
    $s_IntervalString&="|"&int($i*$i_IntervalCombo)
    Next
    ;GUICtrlSetData($Value, $s_IntervalString, $TotalRows-(GUICtrlRead($Value))-1)
    ;====================================================Rows
    ;if $nMsg <> $Value and $nMsg <> $updown and $nMsg <> $down and $nMsg <> $Tab1combo1 then GUICtrlSetData($Value, $s_IntervalString, $TotalRows-(GUICtrlRead($Value))-1)
    if $nMsg <> $Value and $nMsg <> $updown and $nMsg <> $Tab1combo1 and $nmsg<> $down then GUICtrlSetData($Value, $s_IntervalString, GUICtrlRead($Value)-1)
    if $nMsg =$Value then
    GUICtrlSetData($down,0)
    GUICtrlSetData($updown,0)
    EndIf
    if $nMsg = $updown then GUICtrlSetData($down,-GUICtrlRead($updown))
    if $nMsg = $down then GUICtrlSetData($updown,-GUICtrlRead($down) )
    $i_FromUpDownT=int(number(GUICtrlRead($updown))*number(GUICtrlRead($Tab1combo1)))
    $i_FromDownT=int(number(GUICtrlRead($down))*number(GUICtrlRead($Tab1combo1)))
    $i_NewStart=number(GUICtrlRead($Value))-_iif(number(GUICtrlRead($Value))=0,0,1)-$i_FromUpDownT
    if $TotalRows-$i_NewStart<number(GUICtrlRead($Tab1combo1)) then $i_NewStart=$TotalRows-number(GUICtrlRead($Tab1combo1))
    ;====================================================Cols
    $i_TotalNumRowsToShow=GUICtrlRead($Tab1combo1)
    $i_FirstItem=$i_NewStart
    $i_ItemsNumber=$i_NewStart
    _LockAndWait2()
    While $i_numItems<$i_TotalNumRowsToShow+1
    $i_numItems+=1
    $szFile=FileReadLine($hSearch)
    If @error = -1 Then ExitLoop
    $nIcon = 0
    $szIconFile = $szPath & "\" & $szFile
    FileGetIcon($szIconFile, $nIcon, $szFile)
    $IsDir = StringInStr(FileGetAttrib($szPath & "\" & $szFile),"D")
    $szSize = ""
    If $IsDir Then
    $szType = $szDirType
    Else
    $szSize = Round(FileGetSize($szPath & "\" & $szFile) / 1000) & " KB"
    $szType = FileGetType($szFile)
    EndIf
    $arDate = FileGetTime($szPath &"\" & $szFile)
    If IsArray($arDate) Then $szDate = $arDate[2] & "." & $arDate[1] & "." & $arDate[0] & " " & $arDate[3] & ":" & $arDate[4]
    $nItem = GUICtrlCreateListViewItem($szFile & "|" & $szSize & "|" & $szType & "|" & $szDate& "|" & $i_numItems, $nListView)
    If $IsDir Then
    GUICtrlSetImage(-1,$szIconFile, 3)
    Else
    GUICtrlSetImage(-1,$szIconFile,$nIcon)
    EndIf
    If $nFirstItem = 0 Then $nFirstItem = $nItem
    WEnd
    _ResetLockWait2()
    $nLastItem = $nItem
    If $nLastItem > 0 Then
    GUICtrlSetData($statusbarobj, $nLastItem - $nFirstItem & " Objects")
    Else
    GUICtrlSetData($statusbarobj, "Ready")
    EndIf
    FileClose($hSearch)
    $s_MsgValue=GUICtrlRead($Value)
    ;MsgBox(0,"","$s_MsgValue="&$s_MsgValue)
    GUICtrlSetData($Value, 0)
    EndFunc ;==>DirToList
    Func Re_List($szPath)
    local $s_AnswerFile=@ScriptDir & '\au3.txt'
    Dim $hSearch, $szFile, $szDate, $szType, $nItem
    If StringRight($szPath, 1) == "\" Then $szPath = StringTrimRight($szPath, 1)
    $hSearch = FileOpen($s_AnswerFile,0)
    $nItem = -1
    $i_numItems=0
    ;====================================================CountRows
    $TotalRows=_FileCountLines( $s_AnswerFile )
    $s_IntervalString=""
    $i_IntervalCombo=$TotalRows/20
    for $i=0 to 20
    $s_IntervalString&="|"&int($i*$i_IntervalCombo)
    Next
    ;====================================================Rows
    if $nMsg <> $Value and $nMsg <> $updown and $nMsg <> $Tab1combo1 and $nMsg <> $down then GUICtrlSetData($Value, $s_IntervalString, $TotalRows-(GUICtrlRead($Value))-1)
    if $nMsg =$Value then
    GUICtrlSetData($down,0)
    GUICtrlSetData($updown,0)
    EndIf
    if $nMsg = $updown then GUICtrlSetData($down,-GUICtrlRead($updown))
    if $nMsg = $down then GUICtrlSetData($updown,GUICtrlRead($updown)-1 )
    $i_FromUpDownT=int(number(GUICtrlRead($updown))*number(GUICtrlRead($Tab1combo1)))
    $i_FromDownT=int(number(GUICtrlRead($down))*number(GUICtrlRead($Tab1combo1)))
    $i_NewStart=number(GUICtrlRead($Value))-_iif(number(GUICtrlRead($Value))=0,0,1)-$i_FromUpDownT
    if ($TotalRows-$i_NewStart)<number(GUICtrlRead($Tab1combo1)) then $i_NewStart=$TotalRows-number(GUICtrlRead($Tab1combo1))
    if $i_NewStart<0 then $i_NewStart=0
    ;====================================================Cols
    $i_TotalNumRowsToShow=GUICtrlRead($Tab1combo1)
    $i_FirstItem=$i_NewStart
    $i_ItemsNumber=$i_NewStart
    _LockAndWait2()
    _GUICtrlListView_DeleteAllItems ($nListView)
    While $i_numItems<$i_TotalNumRowsToShow+1
    $i_numItems+=1
    $i_ItemsNumber+=1
    $szFile=FileReadLine($hSearch,$i_ItemsNumber)
    If @error = -1 Then ExitLoop
    $nIcon = 0
    $szIconFile = $szPath & "\" & $szFile
    FileGetIcon($szIconFile, $nIcon, $szFile)
    $IsDir = StringInStr(FileGetAttrib($szPath & "\" & $szFile),"D")
    $szSize = ""
    If $IsDir Then
    $szType = $szDirType
    Else
    $szSize = Round(FileGetSize($szPath & "\" & $szFile) / 1000) & " KB"
    $szType = FileGetType($szFile)
    EndIf
    $arDate = FileGetTime($szPath &"\" & $szFile)
    If IsArray($arDate) Then $szDate = $arDate[2] & "." & $arDate[1] & "." & $arDate[0] & " " & $arDate[3] & ":" & $arDate[4]
    $nItem = GUICtrlCreateListViewItem($szFile & "|" & $szSize & "|" & $szType & "|" & $szDate& "|" &$i_ItemsNumber , $nListView)
    If $IsDir Then
    GUICtrlSetImage(-1,$szIconFile, 3)
    Else
    GUICtrlSetImage(-1,$szIconFile,$nIcon)
    EndIf
    If $nFirstItem = 0 Then $nFirstItem = $nItem
    WEnd
    _ResetLockWait2()
    $nLastItem = $nItem
    If $nLastItem > 0 Then
    GUICtrlSetData($statusbarobj, $nLastItem - $nFirstItem & " Objects")
    Else
    GUICtrlSetData($statusbarobj, "Ready")
    EndIf
    FileClose($hSearch)
    ;MsgBox(0,"","Done once at least!")
    EndFunc ;==>Re_List
    Func _LockAndWait2()
    Local $Cursor_WAIT
    GUISetState(@SW_LOCK)
    GUISetCursor($Cursor_WAIT, 1)
    EndFunc ;==>_LockAndWait2
    Func _ResetLockWait2()
    Local $Cursor_ARROW
    GUISetState(@SW_UNLOCK)
    GUISetCursor($Cursor_ARROW, 1)
    EndFunc ;==>_ResetLockWait2

    [/autoit]

    Mega

  • Danke für dieses weitere Beispiel. Leider fehlt auch hier das, wonach ich suche und das ist die Miniaturansicht im Windows-Explorer. Übrigens fallen mir in diesem Zusammenhang 2 Fragen ein.

    • Kann man UDFs oder Scriptfragmente einfach so verwenden auch in einem kommerziellen Projekt?
    • In den Beispielen wird mit DLLStructs und offensichtlich Schnittstellen zu COM-Objekten "herumgewirbelt". Wo bekommt man denn die Informationen her, was wie aufgebaut ist und welche Schnittstellen beispielsweise überhaupt existieren?

    Danke schon vorab für die Hilfe,

    Ghostbuster