1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Bitnugger

Beiträge von Bitnugger

  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 12. Januar 2021 um 13:18
    Zitat von Professor Bernd

    Script von Bitnugger hat mir alle Icons kreuz und quer um die Ohren gehauen!

    Oh ja... ich denke ich habe die fehlerhafte Zeile gefunden:

    _GUICtrlListView_SetItemPosition($g_hListview, $iIndex, $aIcons[$iIndex][1], $aIcons[$iIndex][2]) ; Position wieder restaurieren!

    Richtig ist:

    _GUICtrlListView_SetItemPosition($g_hListview, $i, $aIcons[$iIndex][1], $aIcons[$iIndex][2]) ; Position wieder restaurieren!

    Nur um das klarzustellen: ICU (Icon Configuration Utility) von KaFu ist definitiv die bessere Wahl... das Minimal-Script von Veronesi und auch die geänderte Version von mir funktionieren nur dann, wenn die Desktopeinstellungen es zulassen. ICU berücksichtig diese jedoch.

  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 12. Januar 2021 um 02:30
    Zitat von water

    Wie wäre es mit dem Icon Configuration Utility von KaFu?

    Danke... habe mal rein geschaut... Fehlerprüfung hat er deaktiviert... ist nicht wirklich sauber geschrieben, aber sicher einen Blick wert.

    SEuBo - ich habe aus dem Script von KaFu die Funktion zum Ermitteln des Desktop-Handle mit bei mir eingebaut... teste es mal damit.

    AutoIt
    ;-- TIME_STAMP   2021-01-12 02:18:05
    
    #AutoIt3Wrapper_UseX64=y ; Without this entry we could NOT read the Icons Text on a 64bit OS.
    
    #include <File.au3>
    #include <GuiListView.au3>
    #include <WinAPIConv.au3>
    
    Global $g_iOutEncoding = Int(StringRegExpReplace(FileRead(@LocalAppDataDir & '\AutoIt v3\SciTE\SciTEUser.properties'), '(?s).+\Routput\.code\.page=(.+?)\R.*', '\1'))
    Global $g_sSettings = @ScriptDir & "\DesktopIcons.ini", $g_hDesktop, $g_hListview, $g_hActive = WinGetHandle('[ACTIVE]')
    
    $g_hDesktop = _GetDesktopHandle()
    $g_hListview = HWnd(@extended)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $g_hDesktop  --> " & $g_hDesktop & @LF)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $g_hListview --> " & $g_hListview & @LF)
    
    _SaveDesktopIcons()
    MsgBox(64, @ScriptName, StringFormat('Benutzeraktion\n\nBitte einige Icons verschieben, dann auf OK klicken'), 0, $g_hActive)
    _RestoreDesktopIcons()
    
    Func _SaveDesktopIcons()
        Local $sName, $x, $y, $aIcons[0][3], $sColor
    
        For $i = 0 To _GUICtrlListView_GetItemCount($g_hListview) - 1
            $sName = _GUICtrlListView_GetItemText($g_hListview, $i)
            $x     = _GUICtrlListView_GetItemPositionX($g_hListview, $i)
            $y     = _GUICtrlListView_GetItemPositionY($g_hListview, $i)
            $sColor = $sName = '' ? '!' : '>'
            _ConOut(StringFormat('%s Save Icon: %-44s \t Index: %2i \t Pos: [%4i, %4i]\n', $sColor, '"' & $sName & '"', $i, $x, $y))
            _ArrayAdd($aIcons, StringFormat('%s|%i|%i', $sName, $x, $y))
        Next
        _FileWriteFromArray($g_sSettings, $aIcons, Default, Default, Default)
        _ArrayDisplay($aIcons, '_SaveDesktopIcons: $aIcons')
    EndFunc   ;==>_SaveDesktopIcons
    
    Func _RestoreDesktopIcons()
        Local $sName, $iIndex, $aItemPos, $aIcons[0][3], _
                $aError = ['Error opening specified file', 'Unable to split the file', 'File lines have different numbers of fields (only if $FRTA_INTARRAYS flag not set)', 'No delimiters found (only if $FRTA_INTARRAYS flag not set)']
    
        _FileReadToArray($g_sSettings, $aIcons, $FRTA_NOCOUNT, '|')
        If @error Then Exit MsgBox(16, @ScriptName, $aError[@error - 1], 3, $g_hActive)
        _ArrayDisplay($aIcons, '_RestoreDesktopIcons: $aIcons')
    
        ConsoleWrite(@CRLF)
        For $i = 0 To _GUICtrlListView_GetItemCount($g_hListview) - 1
            $sName  = _GUICtrlListView_GetItemText($g_hListview, $i) ; $sName kann leer "" und/oder mehrmals vorhanden sein - @error ist immer 0!
            $iIndex = _ArraySearch($aIcons, $sName)
            If $iIndex > -1 Then
                $aItemPos = _GUICtrlListView_GetItemPosition($g_hListview, $i) ; Fehler, wenn $aItemPos = [0, 0]!
                If $aItemPos[0] > 0 And $aItemPos[1] > 0 Then
                    If $aItemPos[0] <> $aIcons[$iIndex][1] Or $aItemPos[1] <> $aIcons[$iIndex][2] Then ; Icon hat nicht mehr die gespeicherte Position?
                        _ConOut(StringFormat('> Restore Icon: %-44s \t Index: %2i \t Pos: [%4i, %4i] -> [%4i, %4i]\n', _
                                '"' & $sName & '"', $i, $aItemPos[0], $aItemPos[1], $aIcons[$iIndex][1], $aIcons[$iIndex][2]))
                        _GUICtrlListView_SetItemPosition($g_hListview, $i, $aIcons[$iIndex][1], $aIcons[$iIndex][2]) ; Position wieder restaurieren!
                    EndIf
                Else
                    _ConOut('! Aktuelle Position des Icons für "' & $sName & '" Index ' & $i & ' konnte nicht ermittelt werden!' & @CRLF)
                EndIf
                _ArrayDelete($aIcons, $iIndex) ; Icon aus Array entfernen.
            Else
                _ConOut('- Neues Icon, Position wurde noch nicht gespeichert! -> "' & $sName & '"' & @CRLF)
            EndIf
        Next
        _ArrayDisplay($aIcons, '_RestoreDesktopIcons: $aIcons') ; Ist leer, wenn kein Fehler aufgetreten ist.
    EndFunc   ;==>_RestoreDesktopIcons
    
    Func _GetDesktopHandle()
        Local $aWinlist, $hDeskWin, $hSHELLDLL_DefView, $h_Listview_Configs
    
        ; The traditional Windows Classname for the Desktop, not always so on newer O/S's
        $hDeskWin = WinGetHandle("[CLASS:Progman]")
        ; Parent->Child relationship: Desktop->SHELLDLL_DefView
        $hSHELLDLL_DefView = ControlGetHandle($hDeskWin, '', '[CLASS:SHELLDLL_DefView; INSTANCE:1]')
        ; No luck with finding the Desktop and/or child?
        If $hDeskWin = '' Or $hSHELLDLL_DefView = '' Then
            ; Look through a list of WorkerW windows - one will be the Desktop on Windows 7+ O/S's
            $aWinlist = WinList("[CLASS:WorkerW]")
            For $i = 1 To $aWinlist[0][0]
                $hSHELLDLL_DefView = ControlGetHandle($aWinlist[$i][1], '', '[CLASS:SHELLDLL_DefView; INSTANCE:1]')
                If $hSHELLDLL_DefView <> '' Then
                    $hDeskWin = $aWinlist[$i][1]
                    ExitLoop
                EndIf
            Next
        EndIf
        If $hDeskWin = '' Or $hSHELLDLL_DefView = '' Then
            $hDeskWin = WinGetHandle("[CLASS:NDesk]")
            $hSHELLDLL_DefView = ControlGetHandle($hDeskWin, "", "[CLASS:SHELLDLL_DefView; INSTANCE:1]")
            If IsHWnd($hDeskWin) And IsHWnd($hSHELLDLL_DefView) Then
                MsgBox(16, @ScriptName, StringFormat('Sieht aus als wäre Fences (von Stardock) installiert...\n\n...das Script wird dann nicht benötigt!'), 3, $g_hActive)
    ;~             Exit
            EndIf
        EndIf
    
        ; Parent->Child relationship: Desktop->SHELDLL_DefView->SysListView32
        $h_Listview_Configs = ControlGetHandle($hSHELLDLL_DefView, '', '[CLASS:SysListView32; INSTANCE:1]')
    ;~     If $h_Listview_Configs = '' Then Return SetError(-1, 0, '')
        If $h_Listview_Configs = '' Then Exit MsgBox(16, @ScriptName, 'Desktop-Handle konnte nicht ermittelt werden!', 3, $g_hActive)
        Return SetExtended($h_Listview_Configs, $hDeskWin)
    EndFunc   ;==>_GetDesktopHandle
    
    ; Damit Umlaute und Sonderzeichen "in der Console und in SciTE" korrekt dargestellt werden.
    Func _ConOut($vText)
        ; String(), Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
        ConsoleWrite(_WinAPI_WideCharToMultiByte(String($vText), @Compiled ? 1 : $g_iOutEncoding, True, False))
    EndFunc   ;==>_ConOut
    Alles anzeigen
  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 11. Januar 2021 um 22:41
    Zitat von SEuBo

    Funktionieren allerdings beide (weder das von Veronesi, noch von Dir Bitnugger ) bei mir. Windows 10 version 2004 , 64 Bit.

    Schon seltsam... ich habe:

    AutoIt: 3.3.14.5/X64

    PC1: Windows 10 20H2 (Build 19042.685), X64

    PC2: Windows 10 Version 2004 (Build 19041.685), X64

    Auf PC1 habe ich Fences installiert ControlGetHandle("[CLASS:NDesk]", ...) und auf PC2 nicht ControlGetHandle("[CLASS:Progman]", ...), auf beiden funktioniert es.

    Mein bei Windows angemeldeter User ist in der Gruppe der Administratoren (Default) und UAC ist deaktiviert... aber das kann es nicht sein!?

    Was sagt denn das AutoIt-Info-Tool, wenn du den Finder auf dem Desktop (freie Stelle) loslässt?

    Progman.jpg

  • Position von Desktop Icons speichern und wiederherstellen

    • Bitnugger
    • 11. Januar 2021 um 20:00
    Zitat von @CHMux

    Das Skript unter dem Link von SEuBo (Desktop icons) ist schon mal sehr gut.

    Na ja, gut ist relativ... hier mal meine Version:

    AutoIt
    ;-- TIME_STAMP   2021-01-11 19:57:47
    
    #AutoIt3Wrapper_UseX64=y ; Without this entry we could NOT read the Icons Text on a 64bit OS.
    
    #include <File.au3>
    #include <GuiListView.au3>
    #include <WinAPIConv.au3>
    
    Global $g_iOutEncoding = Int(StringRegExpReplace(FileRead(@LocalAppDataDir & '\AutoIt v3\SciTE\SciTEUser.properties'), '(?s).+\Routput\.code\.page=(.+?)\R.*', '\1'))
    Global $g_sSettings = @ScriptDir & "\DesktopIcons.ini", $g_hDesktop, $g_hActive = WinGetHandle('[ACTIVE]')
    
    _GetDesktopHandle($g_hDesktop)
    _SaveDesktopIcons()
    MsgBox(64, @ScriptName, StringFormat('Benutzeraktion\n\nBitte einige Icons verschieben, dann auf OK klicken'), 0, $g_hActive)
    _RestoreDesktopIcons()
    
    Func _SaveDesktopIcons()
        Local $sName, $x, $y, $aIcons[0][3], $sColor
    
        For $i = 0 To _GUICtrlListView_GetItemCount($g_hDesktop) - 1
            $sName = _GUICtrlListView_GetItemText($g_hDesktop, $i)
            $x     = _GUICtrlListView_GetItemPositionX($g_hDesktop, $i)
            $y     = _GUICtrlListView_GetItemPositionY($g_hDesktop, $i)
            $sColor = $sName = '' ? '!' : '>'
            _ConOut(StringFormat('%s Save Icon: %-44s \t Index: %2i \t Pos: [%4i, %4i]\n', $sColor, '"' & $sName & '"', $i, $x, $y))
            _ArrayAdd($aIcons, StringFormat('%s|%i|%i', $sName, $x, $y))
        Next
        _FileWriteFromArray($g_sSettings, $aIcons, Default, Default, Default)
        _ArrayDisplay($aIcons, '_SaveDesktopIcons: $aIcons')
    EndFunc   ;==>_SaveDesktopIcons
    
    Func _RestoreDesktopIcons()
        Local $sName, $iIndex, $aItemPos, $aIcons[0][3], _
                $aError = ['Error opening specified file', 'Unable to split the file', 'File lines have different numbers of fields (only if $FRTA_INTARRAYS flag not set)', 'No delimiters found (only if $FRTA_INTARRAYS flag not set)']
    
        _FileReadToArray($g_sSettings, $aIcons, $FRTA_NOCOUNT, '|')
        If @error Then Exit MsgBox(16, @ScriptName, $aError[@error - 1], 3, $g_hActive)
        _ArrayDisplay($aIcons, '_RestoreDesktopIcons: $aIcons')
    
        ConsoleWrite(@CRLF)
        For $i = 0 To _GUICtrlListView_GetItemCount($g_hDesktop) - 1
            $sName  = _GUICtrlListView_GetItemText($g_hDesktop, $i) ; $sName kann leer "" und/oder mehrmals vorhanden sein - @error ist immer 0!
            $iIndex = _ArraySearch($aIcons, $sName)
            If $iIndex > -1 Then
                $aItemPos = _GUICtrlListView_GetItemPosition($g_hDesktop, $i) ; Fehler, wenn $aItemPos = [0, 0]!
                If $aItemPos[0] > 0 And $aItemPos[1] > 0 Then
                    If $aItemPos[0] <> $aIcons[$iIndex][1] Or $aItemPos[1] <> $aIcons[$iIndex][2] Then ; Icon hat nicht mehr die gespeicherte Position?
                        _ConOut(StringFormat('> Restore Icon: %-44s \t Index: %2i \t Pos: [%4i, %4i] -> [%4i, %4i]\n', _
                                '"' & $sName & '"', $i, $aItemPos[0], $aItemPos[1], $aIcons[$iIndex][1], $aIcons[$iIndex][2]))
                        _GUICtrlListView_SetItemPosition($g_hDesktop, $iIndex, $aIcons[$iIndex][1], $aIcons[$iIndex][2]) ; Position wieder restaurieren!
                    EndIf
                Else
                    _ConOut('! Aktuelle Position des Icons für "' & $sName & '" Index ' & $i & ' konnte nicht ermittelt werden!' & @CRLF)
                EndIf
                _ArrayDelete($aIcons, $iIndex) ; Icon aus Array entfernen.
            Else
                _ConOut('- Neues Icon, Position wurde noch nicht gespeichert! -> "' & $sName & '"' & @CRLF)
            EndIf
        Next
        _ArrayDisplay($aIcons, '_RestoreDesktopIcons: $aIcons') ; Ist leer, wenn kein Fehler aufgetreten ist.
    EndFunc   ;==>_RestoreDesktopIcons
    
    Func _GetDesktopHandle(ByRef $hDesktop)
        $hDesktop = ControlGetHandle("[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
        If Not IsHWnd($hDesktop) Then
            $hDesktop = ControlGetHandle("[CLASS:NDesk]", "", "[CLASS:SysListView32; INSTANCE:1]")
            If IsHWnd($hDesktop) Then
                MsgBox(16, @ScriptName, StringFormat('Sieht aus als wäre Fences (von Stardock) installiert...\n\n...das Script wird dann nicht benötigt!'), 3, $g_hActive)
    ;~             Exit
            EndIf
        EndIf
        If Not IsHWnd($g_hDesktop) Then Exit MsgBox(16, @ScriptName, 'Desktop-Handle konnte nicht ermittelt werden!', 3, $g_hActive)
    EndFunc   ;==>_GetDesktopHandle
    
    ; Damit Umlaute und Sonderzeichen "in der Console und in SciTE" korrekt dargestellt werden.
    Func _ConOut($vText)
        ; String(), Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
        ConsoleWrite(_WinAPI_WideCharToMultiByte(String($vText), @Compiled ? 1 : $g_iOutEncoding, True, False))
    EndFunc   ;==>_ConOut
    Alles anzeigen
  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 3. Januar 2021 um 18:30

    Hier eine etwas geänderte Version des Bsp. aus der AutoIt-Hilfe zu _WinAPI_DragAcceptFiles, das auch funktioniert, wenn das Script als Administrator ausgeführt wird.

    Im Original wird ein Label verwendet, für Tweaky habe ich dafür nun ein Listview verwendet... und zudem folgende auskommentierte Zeilen im Script aktiviert:

    AutoIt
    ; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
    #cs
    If IsAdmin() Then
        _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
        _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_DROPFILES, $MSGFLT_ALLOW)
    EndIf
    #ce

    Dies ermöglicht den Empfang von WM_DROPFILES von Prozessen mit niedrigeren Berechtigungen.

    Weil sich das Listview in dem geänderten Bsp. in einer Group befindet, muss bei _WinAPI_DragAcceptFiles das Handle der Group angegeben werden, ohne Group das Handle des Listviews.

    AutoIt: DragDrop (WinProg, Listview, geht auch als Admin).au3
    ;-- TIME_STAMP   2021-01-03 18:11:21
    
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>
    #include <WinAPI.au3>
    #include <WinAPISys.au3>
    #include <WindowsConstants.au3>
    
    OnAutoItExitRegister('OnAutoItExit')
    
    ; Create GUI
    Global $g_hGUI = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 420, 660)
    
    Global $g_idGroup = GUICtrlCreateGroup('Drop here', 5, 5, 410, 650, -1, $WS_EX_TRANSPARENT)
    Global $g_hGroup = GUICtrlGetHandle(-1)
    Global $g_iExStyle = BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES) ; default (-1) : $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE
    Global $g_idListview = GUICtrlCreateListView("Droped files", 10, 20, 400, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
    Global $g_hListview = GUICtrlGetHandle(-1)
    _GUICtrlListView_SetExtendedListViewStyle($g_idListview, $g_iExStyle) ; $WS_EX-Styles mit GUICtrlCreateListView und $LVS_EX-Styles mit _GUICtrlListView_SetExtendedListViewStyle setzen.
    ; Mit _GUICtrlListView_GetExtendedListViewStyle($idListview) kann man sich den Wert für die $LVS_EX-Syles holen.
    ; Mit _WinAPI_GetWindowLong(GUICtrlGetHandle($idListview), $GWL_EXSTYLE) kann man sich den Wert für die $LVS_EX-Syles und die $WS_EX-Styles holen.
    ; Das AutoIt-Info-Tool zeigt bei Listviews im Tab "Control" übrigens nur den Wert für die $LVS_EX-Syles an.
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 378)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, 0xFF0000)
    
    Global $g_idCheck = GUICtrlCreateCheckbox('Enable Drag && Drop', 10, 630, 120, 19)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group
    
    Global $g_hAccept = $g_hGroup ; Ohne Group = $g_hListview
    Global $g_iCheck
    
    ; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
    ;~ #cs
    ConsoleWrite('IsAdmin() = ' & IsAdmin() & @CRLF)
    If IsAdmin() Then
        _WinAPI_ChangeWindowMessageFilterEx($g_hAccept, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
        _WinAPI_ChangeWindowMessageFilterEx($g_hAccept, $WM_DROPFILES, $MSGFLT_ALLOW)
    EndIf
    ;~ #ce
    
    ; Register Listview window proc
    Global $g_hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $g_pDll = DllCallbackGetPtr($g_hDll)
    Global $g_hProc = _WinAPI_SetWindowLong($g_hAccept, $GWL_WNDPROC, $g_pDll)
    
    GUISetState(@SW_SHOW)
    
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $g_idCheck
                $g_iCheck = GUICtrlRead($g_idCheck) = $GUI_CHECKED
                _WinAPI_DragAcceptFiles($g_hAccept, $g_iCheck)
                GUICtrlSetBkColor($g_idListview, $g_iCheck ? 0x0000FF : 0xFF0000)
    
        EndSwitch
    WEnd
    
    Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
            Case $WM_DROPFILES
                Local $aFileList = _WinAPI_DragQueryFileEx($wParam)
                If Not @error Then
                    ConsoleWrite('--------------------------------------------------' & @CRLF)
                    For $i = 1 To $aFileList[0]
                        ConsoleWrite($aFileList[$i] & @CRLF)
                        GUICtrlCreateListViewItem($aFileList[$i], $g_idListview)
                    Next
                EndIf
                _WinAPI_DragFinish($wParam)
                Return 0
        EndSwitch
        Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc   ;==>_WinProc
    
    Func OnAutoItExit()
        _WinAPI_SetWindowLong($g_hAccept, $GWL_WNDPROC, $g_hProc)
        DllCallbackFree($g_hDll)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen
  • MySQL Abfrage in Formular ausgeben

    • Bitnugger
    • 2. Januar 2021 um 15:36
    Zitat von Wolfsblut

    Es scheint ja leider nicht ohne ODBC zu gehen.

    Doch, das geht... z.B. mit der UDF von ProgAndy: MySQL UDFs (without ODBC)

  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 18:33

    Hier noch ein Bsp. mit MsgBox, wo die Kombination der Flags auch keinen Sinn macht... dass musst du Tweaky und Water dann auch melden. 8o

    Code
    #include <MsgBoxConstants.au3>
    
    Local $iMsgBox = MsgBox($MB_SYSTEMMODAL + $MB_DEFBUTTON1 + $MB_DEFBUTTON2 + $MB_DEFBUTTON3 + $MB_DEFBUTTON4, "Title", "DEFBUTTON = $MB_DEFBUTTON1 + $MB_DEFBUTTON2 + $MB_DEFBUTTON3 + $MB_DEFBUTTON4", 10)
    ConsoleWrite("$iMsgBox --> " & $iMsgBox & @LF) ; 1 wenn Enter gedrückt wird.
  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 17:40
    Zitat von Professor Bernd

    Also, der langen Rede kurzer Sinn, heruntergebrochen auf eine einfache Frage: Ist die oben genannte Aussage in der Hilfe falsch?

    Falsch ist sie nicht... kombinieren kannst du die Flags beliebig... macht nur in einigen Fällen keinen Sinn, wie du selbst nun ja auch erkannt hast... und ja, war sarkastisch gemeint. ;)

    Mit ausschließen meinte ich auf logischer Ebene...

  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 15:54
    Zitat von Professor Bernd

    Das war wohl falsch, denn die Flags schließen sich NICHT gegenseitig aus!

    Stimmt... $FO_APPEND + $FO_OVERWRITE macht ja auch Sinn... und da $FO_READ = 0 ist, ist es implizit eh immer mit dabei... doch das juckt uns nicht, wir geben immer alle Flags an, die wir wollen. 8o

  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 14:30
    Zitat von Professor Bernd

    Bist du sicher?

    Ja... habe die Zeile ein wenig gekürzt, aber dennoch sollte klar sein, dass $FO_READ in Kombination mit $FO_APPEND oder $FO_OVERWRITE keinen Sinn macht... weil $FO_READ ja 0 ist!

    Soeben getestet - mit $FO_APPEND ($FO_READ + $FO_APPEND = $FO_APPEND) funktioniert FileReadLine nur in Kombination mit FileSetPos!

    AutoIt
    ;-- TIME_STAMP   2020-12-31 14:49:35   v 0.1
    
    #include <File.au3>
    
    Global $hFile
    $hFile = FileOpen(@ScriptFullPath, $FO_APPEND)
    ConsoleWrite('! Line ' & @ScriptLineNumber & ' = ' & FileReadLine($hFile, @ScriptLineNumber) & @CRLF)
    ; ==>> ! Line 7 =
    
    Global $iFilePos = FileGetPos($hFile)
    ConsoleWrite('> Old $iFilePos --> ' & $iFilePos & @LF)
    FileSetPos($hFile, 0, $FILE_BEGIN)
    $iFilePos = FileGetPos($hFile)
    ConsoleWrite('> New $iFilePos --> ' & $iFilePos & @LF)
    ConsoleWrite('+ Line ' & @ScriptLineNumber & ' = ' & FileReadLine($hFile, @ScriptLineNumber) & @CRLF)
    ; ==>> + Line 15 = ConsoleWrite('+ Line ' & @ScriptLineNumber & ' = ' & FileReadLine($hFile, @ScriptLineNumber) & @CRLF)
    FileClose($hFile)
    
    $hFile = FileOpen(@ScriptFullPath, $FO_READ)
    ConsoleWrite('+ Line ' & @ScriptLineNumber & ' = ' & FileReadLine($hFile, @ScriptLineNumber) & @CRLF)
    ; ==>> + Line 20 = ConsoleWrite('+ Line ' & @ScriptLineNumber & ' = ' & FileReadLine($hFile, @ScriptLineNumber) & @CRLF)
    FileClose($hFile)
    Alles anzeigen
  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 14:13
    Zitat von Chaspel

    So ist doch schon viel besser.

    Das "viel" lassen wir mal weg... 8o

    So ist besser:

    AutoIt
    #include <Array.au3>
    
    Global $sFileName = @ScriptDir &"\Buchstaben.txt"
    Global $hFile = FileOpen($sFileName) ; $FO_READ kann man sich sparen, weil ist eh Default-Modus
    Global $aFile[5]
    
    For $i = 0 To UBound($aFile) -1
        $aFile[$i] = FileReadLine($hFile)
    Next
    FileClose($hFile)
    
    _ArrayDisplay($aFile, '$aFile')
    Alles anzeigen
  • Script zu langsam

    • Bitnugger
    • 31. Dezember 2020 um 13:58
    Zitat von Professor Bernd

    Wie du siehtst, ist es erstmal nötig, Klarheit reinzubringen. Auch solltest du am Ende alle FileHandles mit FileClose() schließen.

    Sehr nett formuliert... die Zeile hast du wohl übersehen?

    Zitat von Chaspel

    $hFilehandle2 = FileOpen($sFileName2, $FO_READ + $FO_APPEND)

    $FO_READ ist 0 und ergibt in Kombination mit $FO_APPEND = $FO_APPEND... also entweder $FO_READ, oder $FO_APPEND.

    Zudem funktioniert FileReadLine eh nur mit $FO_READ (Lesemodus)... nicht aber mit $FO_APPEND oder $FO_OVERWRITE (Schreibmodus)!

  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 30. Dezember 2020 um 22:09
    Zitat von Tweaky

    In der Konsole steht mit dem Beispiel

    Ops, da warst du wohl zu schnell... ich hatte in dem Script noch ein Exit drin... jetzt aber nicht mehr... teste es bitte noch mal.

    Zitat von Tweaky

    Gibt es einen Weg beides zu bekommen (Dateien auf C:\ speichern und Drag & Drop?)

    Lege ein Verzeichnis auf C:\ an, in dem du deine AutoIt-Files speicherst... dann brauchst du SciTE auch nicht mehr als Admin starten... alle anderen Lösungen sind nicht zu empfehlen!

  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 30. Dezember 2020 um 21:41

    Script in Post #3 - Fehler mit ExStyle korrigiert und _WinAPI_ChangeWindowMessageFilterEx hinzugefügt... Tweaky teste mal, ob es so nun funktioniert.

    _WinAPI_ChangeWindowMessageFilterEx - im Bsp. für _WinAPI_DragAcceptFiles zu finden... ist dort jedoch auskommentiert.

    Code
    ; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
    #cs
    If IsAdmin() Then
        _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
        _WinAPI_ChangeWindowMessageFilterEx($g_hLabel, $WM_DROPFILES, $MSGFLT_ALLOW)
    EndIf
    #ce
  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 30. Dezember 2020 um 18:58
    Zitat von Tweaky

    Was meint ihr?

    Ich habe mir das mit den ExStyles gerade noch mal genauer angeschaut und auch gelesen, was Melba23 dazu geschrieben hat.

    Zitat von @Melba23

    You should always use _GUICtrlListView_SetExtendedListViewStyle to set extended ListView styles. Why? Because some of the values are the same as for $WS_EX_* styles and if you add them in the creation command Windows always applies the $WS_EX styles rather than the $LVS_EX ones.


    Sie sollten immer _GUICtrlListView_SetExtendedListViewStyle verwenden, um erweiterte ListView-Stile festzulegen. Warum? Da einige der Werte mit denen für $WS_EX_* -Stile identisch sind und Sie sie im Erstellungsbefehl hinzufügen, wendet Windows immer die $WS_EX-Stile anstelle der $LVS_EX-Stile an.

    Hier die ExStyles mit identischen Werten:

    Code
    $WS_EX_ACCEPTFILES   = $LVS_EX_HEADERDRAGDROP
    $WS_EX_CONTEXTHELP   = $LVS_EX_INFOTIP
    $WS_EX_DLGMODALFRAME = $LVS_EX_GRIDLINES
    $WS_EX_TOPMOST       = $LVS_EX_TRACKSELECT
    $WS_EX_TRANSPARENT   = $LVS_EX_FULLROWSELECT
    $WS_EX_WINDOWEDGE    = $LVS_EX_FLATSB

    Fazit: $WS_EX-Styles mit GUICtrlCreateListView und $LVS_EX-Styles mit _GUICtrlListView_SetExtendedListViewStyle setzen.

  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 30. Dezember 2020 um 17:08

    Ich habe das Script in Post #3 korrigiert und noch eine Fehlerausgabe eingebaut... teste es mal bitte.

  • ListView - 3 Probleme: ArrayDisplay / Drag & Drop / erweiterte Stile

    • Bitnugger
    • 30. Dezember 2020 um 01:15
    Zitat von Tweaky

    1. Wenn ich das Skript direkt aus SciTE starte, kann ich keine Dateien per Drag & Drop aus dem Explorer auf die GUI ziehen.

    Wenn ich es aus dem Explorer starte funktioniert es.

    Woran kann das liegen?

    Auf die GUI ziehen geht ganz sicher in keinem Fall, da du ja in On_WM_DROPFILES prüfst, ob die Maustaste über dem Listview losgelassen wurde und nur dann verarbeitest du die Message, was übrigens so oder so falsch ist, da zumindest _WinAPI_DragFinish in jedem Fall vor Verlassen der Funktion ausgeführt werden sollte.

    Zitat von Tweaky

    2. Wenn ich Dateien per Drag & Drop aus dem Explorer auf die GUI ziehe, funktioniert _ArrayDisplay nicht (reagiert nicht mehr). Warum?

    Wenn du eine Funktion mit GUIRegisterMsg als Message-Handler registrierst, dann darfst du darin keine blockierenden Funktionen wie MsBox oder _ArrayDisplay ausführen, denn dadurch stauen sich die noch nicht verarbeiteten Messages auf und irgendwann geht dann nichts mehr. Solche Funktionen sollten immer so schnell es geht wieder verlassen werden.

    Zitat von Tweaky

    Global $idListview = GUICtrlCreateListView("Test", 10, 10, 400, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER), BitOR($LVS_EX_DOUBLEBUFFER, $WS_EX_CLIENTEDGE))
    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)

    Hier solltest du dich mal entscheiden, ob du die ExSyles gleich bei GUICtrlCreateListView mit setzt, oder danach mit GUICtrlSendMsg... und 2x GUICtrlSendMsg dafür ausführen, ist auch nicht schön.

    Das macht man dann besser so:

    Global $iExMask = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES) ; Specifies which styles in $iExStyle are to be affected.

    Global $iExStyle = $iExMask

    GUICtrlSendMsg($idListview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $iExStyle, $iExMask)

    Hier mal eine korrigierte Version deines Scripts, mit dem es auch bei dir funktionieren sollte. Dropst du die Files auf das GUI, werden sie nur mit _ArrayDisplay angezeigt, dropst du sie über das Listview, werden sie als Item im Listview hinzugefügt und mit _ArrayDisplay angezeigt.

    AutoIt
    ;-- TIME_STAMP   2020-12-30 21:31:49
    
    #Region    ;************ Includes ************
    #include <APISysConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <GuiListView.au3>
    #include <WinAPIError.au3>
    #include <WinAPISysWin.au3>
    #EndRegion ;************ Includes ************
    
    Opt("GUICloseOnESC", 0) ; 1=ESC beendet, 0=ESC schließt nicht
    Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert
    
    Global $hGui = GUICreate("Test", 500, 700, 0, 0, -1, $WS_EX_ACCEPTFILES)
    
    Global $iExStyle = BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES) ; default (-1) : $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE
    Global $idListview = GUICtrlCreateListView("Test", 10, 10, 400, 600, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
    Global $hListview = GUICtrlGetHandle($idListview)
    _GUICtrlListView_SetExtendedListViewStyle($idListview, $iExStyle) ; $WS_EX-Styles mit GUICtrlCreateListView und $LVS_EX-Styles mit _GUICtrlListView_SetExtendedListViewStyle setzen.
    ; Mit _GUICtrlListView_GetExtendedListViewStyle($idListview) kann man sich den Wert für die $LVS_EX-Syles holen.
    ; Mit _WinAPI_GetWindowLong(GUICtrlGetHandle($idListview), $GWL_EXSTYLE) kann man sich den Wert für die $LVS_EX-Syles und die $WS_EX-Styles holen.
    ; Das AutoIt-Info-Tool zeigt bei Listviews im Tab "Control" übrigens nur den Wert für die $LVS_EX-Syles an.
    GUICtrlSendMsg($idListview, $LVM_SETCOLUMNWIDTH, 0, 378)
    
    Global $bDrag = False, $aDragFiles[0], $iMessageFilter
    
    ConsoleWrite('IsAdmin() = ' & IsAdmin() & @CRLF)
    
    ; Allow WM_DROPFILES to be received from lower privileged processes (Windows Vista or later)
    ;~ #cs
    ;~ If IsAdmin() Then
        $iMessageFilter = _WinAPI_ChangeWindowMessageFilterEx($hListview, $WM_COPYGLOBALDATA, $MSGFLT_ALLOW)
        ConsoleWrite('$iMessageFilter = ' & $iMessageFilter & @CRLF)
        $iMessageFilter = _WinAPI_ChangeWindowMessageFilterEx($hListview, $WM_DROPFILES, $MSGFLT_ALLOW)
        ConsoleWrite('$iMessageFilter = ' & $iMessageFilter & @CRLF)
        ; _WinAPI_ChangeWindowMessageFilterEx($hListview, $WM_COPYDATA, $MSGFLT_ALLOW)
    ;~ EndIf
    ;~ #ce
    
    GUIRegisterMsg($WM_DROPFILES, "On_WM_DROPFILES")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")
    
    GUISetState(@SW_SHOW, $hGui)
    
    While 1
        If $bDrag Then
            $bDrag = False
            _ArrayDisplay($aDragFiles, '$aDragFiles')
        EndIf
        Sleep(10)
    WEnd
    
    Func _beenden()
        Exit
    EndFunc   ;==>_beenden
    
    Func On_WM_DROPFILES($hWnd, $msg, $wParam, $lParam)
        #forceref $msg, $lParam
        Local $tPoint = _WinAPI_DragQueryPoint($wParam)
        If Not @error Then
            $aDragFiles = _WinAPI_DragQueryFileEx($wParam) ; 0 - Return both files and folders (Default).
            If Not @error Then
                $bDrag = True
                Local $hCtrl = _WinAPI_ChildWindowFromPointEx($hWnd, $tPoint)
                If $hCtrl = ControlGetHandle($hGui, "", $idListview) Then     ; ListView
                    For $i = 1 To $aDragFiles[0] Step 1
                        GUICtrlCreateListViewItem($aDragFiles[$i], $idListview)
                    Next
                EndIf
            EndIf
        EndIf
        If @error Then
            ConsoleWrite('! @error             = ' & @error & @CRLF)
            ConsoleWrite('! WinAPIError        = ' & _WinAPI_GetLastError() & @CRLF)
            ConsoleWrite('! WinAPIErrorMessage = ' & _WinAPI_GetLastErrorMessage() & @CRLF)
        EndIf
        _WinAPI_DragFinish($wParam)
    
        _WinAPI_MessageBeep(0) ; Ton erzeugen
    
        Return 0
    EndFunc   ;==>On_WM_DROPFILES
    Alles anzeigen

    Dafür gibt es übrigens eine gute UDF (im letzten Post, mit 2 Bsp.): https://www.autoitscript.com/forum/topic/13…dragdrop-event/

  • Wechsel der Arbeitsplatzumgebung

    • Bitnugger
    • 29. Dezember 2020 um 09:51
    Zitat von Moombas

    if WinGetState($hWnd) <> $WIN_STATE_MAXIMIZED then WinSetState($hWnd, '', @SW_MAXIMIZE)

    Hier (Zeile 68) machst du auch diesen Fehler...

    Besser: If BitAnd(WinGetState($hWnd), $WIN_STATE_MAXIMIZED) <> $WIN_STATE_MAXIMIZED Then WinSetState($hWnd, '', @SW_MAXIMIZE)

  • Wechsel der Arbeitsplatzumgebung

    • Bitnugger
    • 29. Dezember 2020 um 09:10
    Zitat von Moombas

    if WinGetState($hWnd) <> $WIN_STATE_MAXIMIZED then

    Besser: If BitAnd(WinGetState($hWnd), $WIN_STATE_MAXIMIZED) <> $WIN_STATE_MAXIMIZED Then

    Zitat von Moombas

    And ($myY < $__MonitorList[$i][4]) Then $Monitor = $i

    Besser: And ($myY < $__MonitorList[$i][4]) Then Return $i

    Zitat von Moombas

    $hDC = $hDC ;avoid warning
    $lParam = $lParam ;avoid warning

    Besser: #forceref $hDC, $lParam

  • Fehler: Listview

    • Bitnugger
    • 28. Dezember 2020 um 11:09

    Momentan hantiere ich viel mit Listviews und bin dabei auf einige Fehler gestoßen, die ich hier aufzeigen möchte, um anderen Usern damit viel Zeit zu ersparen und das Leben zu erleichtern.

    Zuerst ein "funktioneller" Gruß an water - damit er das hier auch liest... ;)

    Ich liste die Fehler hier in der Reihenfolge auf, in der ich sie gefunden habe.

    #1 Fehler in den Beispielen bei _DebugPrint, die $tagNMITEMACTIVATE verwenden

    _GUICtrlListView_Create, _GUICtrlListView_GetHotItem, _GUICtrlListView_GetHoverTime, _GUICtrlListView_CancelEditLabel, _GUICtrlListView_EditLabel, _GUICtrlListView_SetHoverTime, _GUICtrlListView_GetEditControl, _GUICtrlListView_HitTest, _GUICtrlListView_SubItemHitTest, _GUICtrlListView_ClickItem

    AutoIt: _GUICtrlListView_Create.au3
                    Case $LVN_ITEMACTIVATE ; Sent by a list-view control when the user activates an item
                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                        _DebugPrint("$LVN_ITEMACTIVATE" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
                            "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
                            "-->Code:" & @TAB & $iCode & @CRLF & _
                            "-->Index:" & @TAB & DllStructGetData($tInfo, "Index") & @CRLF & _
                            "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _
                            "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _
                            "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _
                            "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _
                            "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _ ; <<== Fehler - ActionX kann nicht gefunden werden!!!
                            "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _ ; <<== Fehler - ActionY kann nicht gefunden werden!!!
                            "-->lParam:" & @TAB & DllStructGetData($tInfo, "lParam") & @CRLF & _
                            "-->KeyFlags:" & @TAB & DllStructGetData($tInfo, "KeyFlags"))
                        Return 0
    
    ; Richtig wäre:
                           "-->ActionX:" & @TAB & DllStructGetData($tNMITEMACTIVATE, "X") & @CRLF & _
                           "-->ActionY:" & @TAB & DllStructGetData($tNMITEMACTIVATE, "Y") & @CRLF & _
    Alles anzeigen

    DllStructGetData schlägt fehlt, weil ActionX/ActionY in $tagNMITEMACTIVATE ($tInfo) nicht gefunden werden kann - bei $tagNMLISTVIEW wäre ActionX/ActionY jedoch richtig!

    $tagNMLISTVIEW

    struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;int Item;int SubItem;uint NewState;uint OldState;uint Changed;struct;long ActionX;long ActionY;endstruct;lparam Param

    $tagNMITEMACTIVATE

    struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;int Index;int SubItem;uint NewState;uint OldState;uint Changed;struct;long X;long Y;endstruct;lparam lParam;uint KeyFlags

    #2 $NM_RETURN (list view) notification code

    $NM_RETURN kann mit WM_NOTIFY NICHT abgefangen werden - scheint ein Fehler im System zu sein...

    Worakround: Accelerator für "{ENTER}" erstellen und in WM_COMMAND abfangen.

    Dazu gibt es bereits Posts, in denen auch andere Lösungen zu finden sind:

    Listview - Reagiert nicht auf die Enter-Taste

    Der Worakround von nuts ist... ok, Bein amputieren ist schlimmer... aber nicht viel. 8o

    https://www.autoitscript.com/forum/topic/83…-via-wm_notify/

    NM_RETURN (list view) notification code

    #3 $LVN_KEYDOWN ; Notifies a list-view control's parent window that a key has been pressed.

    Der Grund dafür könnte sein, dass die Struktur $tagNMLVKEYDOWN in AutoIt mit "align 1;" ausgerichtet wird, von Microsoft aber nicht.

    Global Const $tagNMLVKEYDOWN = "align 1;struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;word VKey;uint Flags" ; AutoIt

    Global Const $tagFIXEDNMLVKEYDOWN = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;word VKey;uint Flags" ; Microsoft

    Falls jemand Probleme mit $LVN_KEYDOWN hat, dann einfach mal die Fixed-Version verwenden...

    #4 Func _GUICtrlListView_HitTest, _GUICtrlListView_InsertMarkHitTest, _GUICtrlListView_SubItemHitTest

    In allen drei Funktionen wird ein Handle in $hWnd erwartet... wird eine ControlID übergeben, kommt es zu Fehlern.

    _GUICtrlListView_HitTest, _GUICtrlListView_InsertMarkHitTest

    Local $aResult = DllCall("user32.dll", "bool", "ScreenToClient", "hwnd", $hWnd, "struct*", $tPoint) ; Fehler, wenn $hWnd kein Handle ist!

    _GUICtrlListView_SubItemHitTest (wenn $iX oder $iY = -1)

    If $iX = -1 Then $iX = _WinAPI_GetMousePosX(True, $hWnd) ; Fehler, wenn $hWnd kein Handle ist!

    If $iY = -1 Then $iY = _WinAPI_GetMousePosY(True, $hWnd) ; Fehler, wenn $hWnd kein Handle ist!

    Edit: Wobei das hier aber kein Fehler ist, da im Header der Funktion steht, das in $hWnd ein Handle sein muss.

    #5 $LVN_BEGINLABELEDIT, $LVN_ENDLABELEDIT und $LVN_GETINFOTIP

    Diese Cases sind in den bei #1 genannten Beispielen in der Funktion WM_NOTIFY zwar auskommentiert, würden aber einen Fehler produzieren, weil es die Konstanten nicht gibt.

    Richtig wäre:

    Case $LVN_BEGINLABELEDITA, Case $LVN_BEGINLABELEDITW

    Case $LVN_ENDLABELEDITA, Case $LVN_ENDLABELEDITW

    Case $LVN_GETINFOTIPA, Case $LVN_GETINFOTIPW

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™