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

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2021.07.31)

    • Bitnugger
    • 23. Oktober 2021 um 22:06
    Zitat von Musashi

    Warum hast Du bei hier auf meinen Beitrag #77 im JSON-Thread verlinkt ?

    Weil ich wohl zu alt und/oder zu müde bin... habe es korrigiert. :sleeping:

  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Bitnugger
    • 23. Oktober 2021 um 19:53

    So geht es auch:

    AutoIt
    While 1
        $nMsg = GUIGetMsg()
    
        Switch True
            Case $nMsg = $GUI_EVENT_CLOSE, $sAusweisNr <> ""
                _WinAPI_UnhookWindowsHookEx($hKeyHook)
                DllCallbackFree($hKeyProc)
                GUIDelete($hGui)
                Exitloop
        EndSwitch
    WEnd
    Alles anzeigen
  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2021.07.31)

    • Bitnugger
    • 23. Oktober 2021 um 19:30

    Dim, Global und Local

    Mir fällt immer wieder auf, dass viele User die Aussage machen, das Dim nicht mehr benutzt werden sollte, obwohl in der AutoIt-Hilfe kein Wort diesbezüglich zu finden ist.

    Auch jetzt aktuell sehe ich hierim Forum, dass es bez. Dim & Co. noch Fehlinterpretationen/Unklarheiten gibt und die Spezialfälle bei Global/Local wohl noch nicht allen bekannt sind.

    In der Hilfe steht lediglich:

    Schlüsselwort Dim / Global / Local / ConstDer Unterschied zwischen Dim, Local und Global ist der Gültigkeitsbereich, für den die Variablen deklariert werden:
    Dim = Wenn der Variablename nicht schon mit globalem Gültigleitsbereich existiert, hat die definierte Variable einen lokalen Gültigkeitsbereich (falls die Variable schon global existiert, so wird die globale Variable verwendet.)
    Global = Erzwingt globale Gültigkeit der Variablen *
    Local = Erzwingt lokale Gültigkeit der Variablen, bzw. innerhalb der Funktion *Man sollte Local oder Global anstelle von Dim verwenden, um explizit den Gültigkeitsbereich für die Variable / Konstante / Array festzulegen.Die Betonung liegt hier auf "um explizit"! Anderfalls kann Dim verwendet werden... dann wird der Gültigleitsbereich automatisch ermittelt, wie es weiter oben bereits erklärt wurde.

    * nicht immer... hier ein paar Bsp.:

    AutoIt
    Opt('MustDeclareVars', 1)
    
    Global $FO = '%s %-20s: $%-6s (Scope: %2i = %-7s) = "%s"\n'
    Local $sLocal = 'Local ==>> Global'
    
    _Test()
    ;~ _PrintVarInfo('+', '       $sTest', $sTest, 'sTest')           ; ==>> Funktioniert nicht wegen Opt('MustDeclareVars', 1)!
    _PrintVarInfo('@', '       $sTest', IsDeclared('sTest'), 'sTest') ; ==>> ...obwohl sie, wie hier zu sehen ist, als globale Variable deklariert ist!
    
    Func _Test()
        Local $sTest = 'Local', $sVarname = 'sTest', $iScope = IsDeclared($sVarname)
        ConsoleWrite(StringFormat($FO, '+', 'Local $sTest', 'sTest', $iScope, _GetScopeName($iScope), $sTest))
        ConsoleWrite(StringFormat($FO, '+', 'Local $sTest', $sVarname, $iScope, _GetScopeName($iScope), $sTest))
        _PrintVarInfo('>', 'Local $sTest', $sTest, 'sTest')
    
        Global $sTest = 'Global'
        ConsoleWrite(StringFormat('\n' & $FO, '!', 'Global $sTest', 'sTest', $iScope, _GetScopeName($iScope), $sTest))
        ; ==>> wird nicht ausgeführt/erzwungen, weil es bereits eine gleichgnamige Variable mit lokalem Scope in der Funktion _Test gibt!
        
        _PrintVarInfo('+', 'Global $sTest', $sTest, 'sTest')
        ; ==>> wird ausgeführt/erzwungen, weil es keine gleichgnamige Variable mit lokalem Scope in der Funktion _PrintVarInfo gibt!
    
        Dim $sTest = 'Dim'
        _PrintVarInfo('-', 'Dim $sTest', $sTest, 'sTest')
    
        _PrintVarInfo('!', 'Local $sLocal', $sLocal, 'sLocal')
        ; ==>> Mit Local können nur innerhalb einer Funktion lokale Variablen erstellt werden!
        ; ==>> Werden Variablen im globalen Scope (außerhalb einer Funktion) deklariert, sind sie immer global!
    EndFunc
    
    Func _GetScopeName($iScope)
        Return $iScope = 1 ? 'Global' : $iScope = -1 ? 'Local' : 'Unknown'
    EndFunc
    
    Func _PrintVarInfo($sColor, $sHint, $vVar, $sVarname)
        Local $iScope = IsDeclared($sVarname)
        ConsoleWrite(StringFormat($FO, $sColor, $sHint, $sVarname, $iScope, _GetScopeName($iScope), $vVar))
    EndFunc
    
    ; + Local $sTest        : $sTest  (Scope: -1 = Local  ) = "Local"
    ; + Local $sTest        : $sTest  (Scope: -1 = Local  ) = "Local"
    ; > Local $sTest        : $sTest  (Scope:  0 = Unknown) = "Local"
    ;
    ; ! Global $sTest       : $sTest  (Scope: -1 = Local  ) = "Local"
    ; + Global $sTest       : $sTest  (Scope:  1 = Global ) = "Local"
    ; - Dim $sTest          : $sTest  (Scope:  1 = Global ) = "Dim"
    ; ! Local $sLocal       : $sLocal (Scope:  1 = Global ) = "Local ==>> Global"
    ; @        $sTest       : $sTest  (Scope:  1 = Global ) = "1"
    Alles anzeigen
  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Bitnugger
    • 23. Oktober 2021 um 14:42
    Zitat von autoiter

    Du könntest den ersten Block auch wie unten schreiben. Dann wird direkt der nächste Block ausgeführt.

    Ja, allerdings wertet AutoIt dann den nächsten Case nicht aus - es wird lediglich der Code innerhalb des nächsten Cases ausgeführt!

  • Freier RAM abfragen

    • Bitnugger
    • 23. Oktober 2021 um 14:27

    In meinem Post #2 habe ich dir mit dem Link zu Microsoft bereits die nötige Information an die Hand gegeben, um verstehen zu können, was es mit dem Standby-RAM auf sich hat und warum es totaler Schwachsinn ist, die Freigabe dieses RAMs mit Gewalt erzwingen zu wollen.

    Zitat von Ingo Böttcher

    "Standby" heißt, dass dort Systemdateien vorgeladen werden, die häufig genutzt werden, damit sie schneller zur Verfügung stehen. Wird der Speicher für andere Dinge benötigt, wird er in Nanosekunden freigegeben. Daher wird der "Standby" Speicher auch grundsätzlich zum verfügbaren Speicher hinzugezählt. Er ist sofort verfügbar, wenn er gebraucht wird. Du hast somit an sich kein RAM Problem.

    Ja, und wo ist dein Script? Ohne ist das hier nur ein Ratespiel...

    Übrigens: Lernresistenz wird nicht belohnt! 8o

  • JSON-UDF

    • Bitnugger
    • 23. Oktober 2021 um 02:02
    Zitat von Musashi

    Was hältst Du davon, dies als (Ergänzungs-)Vorschlag im aktuellen AutoIt-Hilfethread zur Diskussion zu stellen.

    Wenn du mir einen Link zu diesem Thread gibst, werde ich es machen...

  • JSON-UDF

    • Bitnugger
    • 22. Oktober 2021 um 23:27
    Zitat von Musashi

    Dim gilt es in der Tat zu vermeiden (so steht es auch in der Hilfe zu Dim ) :

    Ja... ist in meinen Augen aber völliger Quatsch.

    Zitat von Musashi

    "Man sollte Local oder Global anstelle von Dim verwenden, um explizit den Gültigkeitsbereich für die Variable / Konstante / Array festzulegen."

    Ja... wenn ich den Gültigkeitsbereich explizit festlegen will... doch wenn ich es nicht will, kommt Dim ins Spiel... denn gibt es die Variable bereits im globalen Scope, wird dieser verwendet, anderfalls wird eine lokale Variable erzeugt - und somit hat Dim sehr wohl eine Lebensberechtigung!

    AutoIt
    Global $iTest1 = 1
    ConsoleWrite('> Global: $iTest1 = ' & $iTest1 & ' IsDeclared = ' & IsDeclared('iTest1') & @CRLF) ; 1 = Global, -1 = Local, 0 = Unknown
    _Test()
    
    Func _Test()
        Dim $iTest1 = 2
        Dim $iTest2 = 3
        ConsoleWrite('! Func  : $iTest1 = ' & $iTest1 & ' IsDeclared = ' & IsDeclared('iTest1') & @CRLF)
        ConsoleWrite('- Func  : $iTest2 = ' & $iTest2 & ' IsDeclared = ' & IsDeclared('iTest2') & @CRLF)
    EndFunc
    
    ; > Global: $iTest1 = 1 IsDeclared = 1
    ; ! Func  : $iTest1 = 2 IsDeclared = 1
    ; - Func  : $iTest2 = 3 IsDeclared = -1
    Alles anzeigen
  • JSON-UDF

    • Bitnugger
    • 22. Oktober 2021 um 21:24
    Zitat von Musashi

    Es ist aber kein guter Programmierstil, Global/Local innerhalb von Schleifen zu deklarieren.

    Und was ist mit Dim[, Const, Static]? 8o

  • SciTE - CommonTools

    • Bitnugger
    • 21. Oktober 2021 um 22:35

    ANSI? ==>> UTF-8!

  • Fehlercode aus Batch auslesen

    • Bitnugger
    • 16. Oktober 2021 um 22:33

    smu

    Habe obiges Bsp. etwas erweitert, damit du auch die Ausgabe eines Fehlers sehen kannst.

  • Fehlercode aus Batch auslesen

    • Bitnugger
    • 16. Oktober 2021 um 20:25

    Schaust du hier: Run , @ComSpec

    1. Parameter

    @ComSpec wird im Normalfall zu "C:\Windows\System32\cmd.exe" (64bit) oder "C:\Windows\SysWOW64\cmd.exe" (32bit) aufgelöst. Damit stellst du sicher, dass der im System voreingestellte Interpreter aufgerufen wird. Man kann natürlich auch einfach "cmd.exe" schreiben... aber mit dem Marko ist es sicherer. @ComSpec (cmd.exe) wird benötigt, wenn CMD-interne Befehle (z.B. echo) oder eine Batch-Datei ausgeführt werden soll, oder wenn eine Pipe (z.B. dir c:|clip) oder Umleitung (z.B. dir c: >m:\c-dir.txt) benötigt wird. Um z.B. einfach nur den Windows-Explorer zu starten, reicht ein Run("explorer.exe")

    /c

    gibt an, dass die CMD.exe nach Ausführung des Befehls beendet werden soll. Mit /k würde das CMD-Fenster offen bleiben.

    'commandName'

    ist ja eigentlich selbsterklärend... ist der Befehl, der in der CMD ausgeführt werden soll... das könnte z.B. 'dir c:' sein.

    2. Parameter

    ""

    Hier kannst du das Arbeisverzeichnis angeben. Das wirkt dann wie ein CD "Balbla...".

    3. Parameter

    @SW_HIDE (CMD-Fenster wird nicht angezeigt) oder @SW_SHOW (CMD-Fenster wird angezeigt)... es gibt noch andere Werte für @SW_* -ist aber hier nicht relevant.

    4. Parameter

    opt_flag

    BitOR($STDERR_CHILD, $STDOUT_CHILD)

    Stellt ein Handle zum *-Stream des Child-Fensters bereit. Hier in unserem Fall also für StderrRead und StdoutRead. Dadurch kannst du dann die Ausgaben des Progamms im CMD-Fenster auslesen.

    Anstelle von BitOR könnte man hier auch einfach ein + nehmen... mit BitOR ist aber sicherer.

    Relevante Themen: ConsoleRead, ProcessClose, RunAs, RunAsWait, RunWait, ShellExecute, ShellExecuteWait, StderrRead, StdinWrite, StdioClose, StdoutRead

    Die Konstanten $STDERR_CHILD, $STDOUT_CHILD sind in AutoItConstants.au3 definiert.

    Hier ein Bsp.:

    AutoIt
    #include <AutoItConstants.au3>
    #include <MsgBoxConstants.au3>
    
    _Example('c:') ; Ausgabe des Inhalts von c: - keine Fehlerausgabe.
    _Example('ä:') ; Ausgabe des Inhalts von WorkingDir, oder falls nicht angegeben (""), des Inhalts, in dem sich das AutoIt-Script befindet (@ScriptDir) - und Ausgabe des Fehlers, der aufgetreten ist - weil Drive "ä:" gibt es ja nicht.
    Exit
    
    Func _Example($sDrive) ; z.B. c:
    ;~     Local $sOutput, $iPID = Run(@ComSpec & " /c " & 'dir c:', "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))
        Local $sOutput, $iPID = Run(@ComSpec & " /c " & 'dir ' & $sPath, "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))
        If Not $iPID Then Exit 1 ; Es ist ein Fehler aufgetreten.
        ProcessWaitClose($iPID) ; Warten, bis CMD.exe beendet wurde.
        $sOutput = StdoutRead($iPID)
        MsgBox($MB_SYSTEMMODAL, "Stdout Read:", $sOutput) ; Die Ausgabe des dir-Befehls.
    
        $sOutput = StderrRead($iPID)
        MsgBox($MB_SYSTEMMODAL, "Stderr Read:", $sOutput) ; Ist hier leer, weil kein Fehler aufgetreten ist.
    EndFunc
    Alles anzeigen
  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2021.07.31)

    • Bitnugger
    • 16. Oktober 2021 um 19:25

    @ComSpec

    Wert von %comspec%, dem SPECifizierten zweiten COMmando Interpreter; primär für die Befehlszeilennutzung, z.B. Run(@ComSpec & " /k help | more").

    Richtig ist:

    Wert von %comspec%, dem SPECifizierten sekundären COMmand-Interpreter; primär für Befehlszeilenanwendungen, z.B. Run(@ComSpec & " /k help | more")

    Im Original:

    Value of %COMSPEC%, the SPECified secondary COMmand interpreter;

    primary for command line uses, e.g. Run(@ComSpec & " /k help | more")

  • als 32bit oder 64bit kompilieren

    • Bitnugger
    • 15. Oktober 2021 um 22:47
    Zitat von Tweaky

    Aber eigentlich könnte man doch nur noch als 64bit kompilieren oder?

    Nein, denn die mit SciTE4AutoIt3 mitgelieferten Tools funktionieren größtenteils leider nicht mit 64bit. Zudem bringt 64bit auch nur selten einen echten Vorteil... ergo nutze ich 64bit nur dann, wenn dem so ist, oder etwas mit 32bit nicht funktioniert. Manchmal ist es auch sinnvoll, beides zu kompilieren... damit das Script (die Exe) mit anderen Programmen arbeiten kann, die ebenfalls in 32bit und 64bit verfügbar sind - z.B. Total Commander.

  • Fehlercode aus Batch auslesen

    • Bitnugger
    • 15. Oktober 2021 um 22:27
    Zitat von smu

    Kann ich mit "@error" oder einem anderen Befehl den in der Batch enstandenen Fehler "feststellen" und im Falle eines Fehlers in AutoIt implementieren?

    Ja, das kannst du, dazu musst du dem Befehl Run('CMD.exe') ein paar mehr Parametern mitgeben.

    Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))

    Schau dir dazu auch mal die Funktion StderrRead an...

    Ja, und herzlich Willkommen hier im Forum!

    PS: Setze deine Scripte demnächst bitte in Code-Tags, damit man sie besser lesen kann. Das ist im Forumseditor das dritte Symbol von rechts: </> - wenn du anschließend auf Quellcode klickst, kannst du die Syntax-Hervorhebung noch auf AutoIt umstellen, weil die Automatische Erkennung anscheinend nicht funktioniert. -- Ich war mal so frei und habe deinen ersten Beitrag in Code-Tags gesetzt.

  • Rahmen ziehen wie bei dem Snipping Tool vom Win10

    • Bitnugger
    • 15. Oktober 2021 um 15:02
    Zitat von Musashi

    Gepostet um 02:38 Uhr ! Einer der wenigen Vorteile bei uns alten Säcken ist zumindest, dass wir weniger Schlaf brauchen ^^

    Falsch, weil momentan bin ich krankgeschrieben und kann mir somit die Zeiten, wann "Tag" für mich ist, nach Belieben einteilen. 8o

    PS: Mein Chef hat mir deswegen gekündigt... aber egal, denn drei Minuten nach Kenntnisnahme der Kündigung hatte ich bereits eine verbindliche Zusage für eine neue (und bessere) Arbeitsstelle... ob das ein neuer Rekord ist? :P

    Zitat von Musashi

    Testen kann ich das Skript leider nicht, da ich nur mit einem, wenn auch sehr guten Monitor arbeite.

    Ebenfalls falsch... kannst du wohl... halt nur nicht, ob es auf einem zweiten Monitor funktioniert. 8o

    Ein paar Dinge werde ich in dem "Tool" aber noch einbauen... vor allem, dass man mit einem Hotkey direkt in den Snipping-Modus kommt, und das man das Capture dann nicht nur als *.png speichern kann.

  • Rahmen ziehen wie bei dem Snipping Tool vom Win10

    • Bitnugger
    • 15. Oktober 2021 um 02:38
    Zitat von Musashi

    Hier ein Script von Melba23 aus dem EN-Forum (minimal geändert) :

    Ich war mal so frei und habe da an einigen Stellen noch was geändert, weil es auf Systemen mit mehreren Monitoren nicht funktionierte!

    PS: WinSetTrans($hCross_GUI, "", 8) habe ich auf 120 gesetzt und die Farbe des Rectangle von schwarz auf rot geändert.

    Schaut es euch an...

    AutoIt: _Mark_Rect.au3
    #cs ----------------------------------------------------------------------------
    Author : Melba23
    https://www.autoitscript.com/forum/topic/165325-how-to-get-4-screen-coordinates-just-by-dragging-a-rectangle/#elControls_1206830_menu
    Modified by...: Musashi, Bitnugger
    #ce ----------------------------------------------------------------------------
    
    #include <AutoItConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <Misc.au3>
    ;~ #include <ScreenCapture.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysWin.au3>
    
    Global $g_hUserDLL = DllOpen("user32.dll")
    
    HotKeySet("{ESC}", "_Terminate")
    
    Global $g_hMain_GUI, $idRect_Button, $idCancel_Button
    Global $g_tPOINT = DllStructCreate($tagPOINT)
    
    Global $g_hRectangle_GUI, $g_iX1, $g_iY1, $g_iX2, $g_iY2
    
    _Main()
    
    Func _Main()
        Local $aMouse_Pos = MouseGetPos(), $aPos
    ;~     DllStructSetData($g_tPOINT, 'X', $aMouse_Pos[0])
    ;~     DllStructSetData($g_tPOINT, 'Y', $aMouse_Pos[1])
        $g_tPOINT.X = $aMouse_Pos[0]
        $g_tPOINT.Y = $aMouse_Pos[1]
        Local $hParent = _WinAPI_GetAncestor(_WinAPI_WindowFromPoint($g_tPOINT), $GA_ROOT)
        $aPos = WinGetPos($hParent)
    
        ; Create GUI
        $g_hMain_GUI = GUICreate("Select Rectangle", 240, 50, ($aPos[2] / 2) - 120, ($aPos[3] / 2) - 25)
    
        $idRect_Button = GUICtrlCreateButton("Mark Area", 10, 10, 80, 30)
        $idCancel_Button = GUICtrlCreateButton("Cancel", 150, 10, 80, 30)
    
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $idCancel_Button
    ;~                 FileDelete(@ScriptDir & "Rect.bmp")
                    Exit
                Case $idRect_Button
                    GUISetState(@SW_HIDE, $g_hMain_GUI)
                    _Mark_Rect()
                    ; Capture selected area (#include <ScreenCapture.au3>)
                    MsgBox($MB_SYSTEMMODAL, "Coords", "Left: " & $g_iX1 & @CRLF & "Top: " & $g_iY1 & @CRLF & "Right: " & $g_iX2 & @CRLF & "Bottom: " & $g_iY2, 5)
                    GUISetState(@SW_SHOW, $g_hMain_GUI)
    ;~                 WinActivate($g_hMain_GUI) ; Hm, bin sprachlos... funktioniert bei mir nicht - das Fenster kommt nicht nach vorne!
                    _WinAPI_SetWindowPos($g_hMain_GUI, $HWND_TOP, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW)) ; Das aber...
            EndSwitch
        WEnd
    EndFunc   ;==>_Main
    
    Func _Mark_Rect()
        Local $aMouse_Pos[2], $aOldMouse_Pos[2], $aPos[4], $hMaster_Rgn, $hRgn, $iRgnType, $iTemp
    
        #Region Create GUIs for Cross cursor and Rectangle
        ; Create transparent GUI with Cross cursor
        Local $w = _WinAPI_GetSystemMetrics($SM_CXVIRTUALSCREEN), $h = _WinAPI_GetSystemMetrics($SM_CYVIRTUALSCREEN)  ;  3840, 1080 [Monitor 1|Monitor 2]
        Local $x = _WinAPI_GetSystemMetrics($SM_XVIRTUALSCREEN), $y = _WinAPI_GetSystemMetrics($SM_YVIRTUALSCREEN)    ; -1920, 0    [Monitor 1|Monitor 2]
        ConsoleWrite(StringFormat('> $w = %5i, $h = %5i, $x = %5i, $y = %5i\n', $w, $h, $x, $y))
    ;~     $hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
        $hCross_GUI = GUICreate("Test", $w, $h, $x, $y, $WS_POPUP, $WS_EX_TOPMOST) ; $w =  3840, $h =  1060, $x = -1920, $y =     0
    
        $aPos = WinGetPos($hCross_GUI)
        ConsoleWrite('> GUI_Pos for Cross cursor and Rectangle: $aPos = ' & _ArrayToString($aPos, ', ') & @CRLF & @CRLF)
    
    ;~     WinSetTrans($hCross_GUI, "", 8)
        WinSetTrans($hCross_GUI, "", 120)
        GUISetState(@SW_SHOW, $hCross_GUI)
        GUISetCursor($IDC_CROSS, $GUI_CURSOR_OVERRIDE, $hCross_GUI)
    
    ;~     $g_hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
        $g_hRectangle_GUI = GUICreate("", $w, $h, $x, $y, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    ;~     GUISetBkColor(0x000000) ; schwarzes Rectangle
        GUISetBkColor(0xFF0000) ; rotes Rectangle
        #EndRegion Create GUIs for Cross cursor and Rectangle
    
        #Region Wait until mouse button pressed
        While Not _IsPressed("01", $g_hUserDLL)
            Sleep(10)
        WEnd
    
        Local $iOldMouseCoordMode = Opt('MouseCoordMode', 0) ; get relative coords to the active window!!!
    
        ; Get first mouse position
        $aMouse_Pos = MouseGetPos()
        $g_iX1 = $aMouse_Pos[0]
        $g_iY1 = $aMouse_Pos[1]
        ConsoleWrite('> $aMouse_Pos #1 = ' & _ArrayToString($aMouse_Pos, ', ') & @CRLF)
    
        Local Static $aRgnType = ['$ERRORREGION', '$NULLREGION', '$SIMPLEREGION', '$COMPLEXREGION']
    
        $aPos = WinGetPos($g_hRectangle_GUI)
        ConsoleWrite('> $g_hRectangle_GUI: $aPos = ' & _ArrayToString($aPos, ', ') & @CRLF & @CRLF)
        Local $left, $top, $right, $bottom
        $left = $g_iX1 + $aPos[0]
        $top = $g_iY1 + $aPos[0]
        #EndRegion Wait until mouse button pressed
    
        #Region Draw rectangle while mouse button pressed
        While _IsPressed("01", $g_hUserDLL)
            While 1
                $aMouse_Pos = MouseGetPos()
                If ($aMouse_Pos[0] & $aMouse_Pos[1]) <> ($aOldMouse_Pos[0] & $aOldMouse_Pos[1]) Then
                    $aOldMouse_Pos = $aMouse_Pos
                    ExitLoop
                EndIf
                If Not _IsPressed("01", $g_hUserDLL) Then ExitLoop
                Sleep(10)
            WEnd
    
            ToolTip('$aMouse_Pos = ' & $aMouse_Pos[0] & ', ' & $aMouse_Pos[1] & @LF & '$g_iX1 = ' & $g_iX1 & ' $g_iY1 = ' & $g_iY1)
    
            $hMaster_Rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    
            $hRgn = _WinAPI_CreateRectRgn($g_iX1, $g_iY1, $g_iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle
            If Not $hRgn Then Exit 2
            $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR)
            ConsoleWrite(">   var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF)
            _WinAPI_DeleteObject($hRgn)
    
            $hRgn = _WinAPI_CreateRectRgn($g_iX1 + 1, $g_iY1 + 1, $aMouse_Pos[0], $g_iY1) ; Top of rectangle
            If Not $hRgn Then Exit 3
            $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR)
            ConsoleWrite("+   var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF)
            _WinAPI_DeleteObject($hRgn)
    
            $hRgn = _WinAPI_CreateRectRgn($aMouse_Pos[0], $g_iY1, $aMouse_Pos[0] + 1, $aMouse_Pos[1])  ; Right of rectangle
            If Not $hRgn Then Exit 4
            $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR)
            ConsoleWrite("-   var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF)
            _WinAPI_DeleteObject($hRgn)
    
            $hRgn = _WinAPI_CreateRectRgn($g_iX1, $aMouse_Pos[1], $aMouse_Pos[0], $aMouse_Pos[1] + 1)   ; Bottom of rectangle
            If Not $hRgn Then Exit 1
            $iRgnType = _WinAPI_CombineRgn($hMaster_Rgn, $hRgn, $hMaster_Rgn, $RGN_OR)
            ConsoleWrite("!   var: $iRgnType --> " & $aRgnType[$iRgnType] & @LF)
            _WinAPI_DeleteObject($hRgn)
    
            ; Set overall region
            If Not _WinAPI_SetWindowRgn($g_hRectangle_GUI, $hMaster_Rgn) Then Exit 5
    
            If WinGetState($g_hRectangle_GUI) < 15 Then GUISetState()
            Sleep(10)
        WEnd
        #EndRegion Draw rectangle while mouse button pressed
    
        ToolTip('')
    
        ; Get second mouse position
        $g_iX2 = $aMouse_Pos[0]
        $g_iY2 = $aMouse_Pos[1]
        ConsoleWrite('> $aMouse_Pos #2 = ' & _ArrayToString($aMouse_Pos, ', ') & @CRLF)
    
        ; Set in correct order if required
    ;~     If $g_iX2 < $g_iX1 Then
    ;~         $iTemp = $g_iX1
    ;~         $g_iX1 = $g_iX2
    ;~         $g_iX2 = $iTemp
    ;~     EndIf
    ;~     If $g_iY2 < $g_iY1 Then
    ;~         $iTemp = $g_iY1
    ;~         $g_iY1 = $g_iY2
    ;~         $g_iY2 = $iTemp
    ;~     EndIf
        _SwitchRect($g_iX1, $g_iX2)
        _SwitchRect($g_iY1, $g_iY2)
    
        GUIDelete($g_hRectangle_GUI)
        GUIDelete($hCross_GUI)
        Opt('MouseCoordMode', $iOldMouseCoordMode)
        ConsoleWrite('Exit _Mark_Rect' & @CRLF)
    EndFunc   ;==>_Mark_Rect
    
    Func _SwitchRect(ByRef $i1, ByRef $i2)
        Local $iTemp
        If $i2 < $i1 Then
            $iTemp = $i1
            $i1 = $i2
            $i2 = $iTemp
        EndIf
    EndFunc   ;==>_SwitchRect
    
    ; -------------------------------------------
    Func _Terminate()
        DllClose($g_hUserDLL)
        Exit ;
    EndFunc   ;==>_Terminate
    Alles anzeigen

    Dateien

    Mark_Rect.au3 7,56 kB – 230 Downloads
  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 14. Oktober 2021 um 13:02
    Zitat von 32vroni

    Solltest Du ein bestimmtes Problem lösen wollen und das nicht zwingend mit AutoIT, könntest Du das vielleicht auch mit verfügbarer Software machen.

    Richtig, das ist so gut wie immer machbar, doch wenn ein User nicht selbst darauf kommt, hat er ein dringenderes Problem, das sich mit Software nicht lösen lässt... von daher ist dieser Hinweis für meine Begriffe eher überflüssig.

    Zitat von 32vroni

    Mach von beiden Verzeichnissen mit der Shell jeweils eine Textdatei und vergleiche die mit Notepad++ mit dem Plugin "Compare".

    Das ist so ziemlich sicher einer der umständlichsten Wege, um sein Problem zu lösen... denn der größte Teil an Arbeit bleibt so ja trotzdem bei ihm hängen. Da du hier die Shell erwähnst... ja, damit ginge das auch relativ einfach... also via Batch mit CMD oder Powershell - die ihm dann die ganze Arbeit abnehmen. Doch irgendwer muss das Batch ja dann auch schreiben... und da muss man schon richtig fit für sein, um dies hinzubekommen.

    Mit AutoIt bekomme ich das in ~ 15-30 Minuten hin... für ein Batch mit CMD oder Powershell wäre mein Tag vermutlich versaut.

    Zitat von 32vroni

    Vermutlich gibt es auch noch diverse andere Hilfsmittel in der weiten Welt des Netzes.

    In der Tat... die gibt es... z.B. Total Commander... der hat eine super Funktion dafür eingebaut, mit der Verzeichnisinhalte synchronisiert werden können - ein sehr mächtiges Werkzeug, dass keine Wünsche offen lässt.

    TC_Sync.png

    TC_Sync_2.png

  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 13. Oktober 2021 um 17:12
    Zitat von Racer

    Ich bin leider auch einer der sehr gerne IF/THEN/ELSE verwendet obwohl es doch viel einfach oder kürzer geht!

    Ja... mal schauen, in 1-3 Jahren siehst du das sicher anders! ;)

    Hier noch ein Bsp., um es dir schmackhaft zu machen 8o :

    AutoIt
    Local $aFileArray1[10], $aFileArray2[9], $iLength
    
    ; Select largest array - If...ElseIf...Else...EndIf
    ; -------------------------------------------------
    ; So etwa habe ich es heute im blauen Forum gesehen.
    If UBound($aFileArray1) > UBound($aFileArray2) Then
        $iLength = UBound($aFileArray1)
    ElseIf UBound($aFileArray1) < UBound($aFileArray2) Then
        $iLength = UBound($aFileArray2)
    Else ; Arrays must be same size
        $iLength = UBound($aFileArray1)
    EndIf
    ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 307 Zeichen
    
    ; Aua... so macht man das:
    Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2)
    If $ub1 > $ub2 Then
        $iLength = $ub1
    ElseIf $ub1 < $ub2 Then
        $iLength = $ub2
    Else ; Arrays must be same size
        $iLength = $ub1
    EndIf
    ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 250 Zeichen
    
    ; Select largest array - Ternary Operator
    ; -------------------------------------------------
    Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2)
    $iLength = ($ub1 > $ub2) ? ($ub1) : ($ub1 < $ub2) ? ($ub2) : ($ub1)
    ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; --------------------- insgesamt 179 Zeichen
    
    ; Ohne () geht auch, kann aber in die Hose gehen... doch hier würde ich es ohne machen.
    Local $ub1 = UBound($aFileArray1), $ub2 = UBound($aFileArray2)
    $iLength = $ub1 > $ub2 ? $ub1 : $ub1 < $ub2 ? $ub2 : $ub1
    ConsoleWrite('$iLength = ' & $iLength & @CRLF) ; -------------------- insgesamt 169 Zeichen
    Alles anzeigen
  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 13. Oktober 2021 um 09:36
    Zitat von Musashi

    Könntest Du Deine Lösung ggf. auch im englischen Thread posten ?

    Das ist ja keine Lösung, sondern lediglich eine kleine Demo. ;)

    Zitat von Musashi

    Wenn ich das mache, dann bekomme ich am Ende noch (völlig unverdient) die Credits ;) .

    Sei dir gegönnt... also mach dich ran... 8o

  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 13. Oktober 2021 um 08:32
    Zitat von Racer

    Bitte, kannst Du mir das erklären?

    ? ist der Ternary Operator - eine Kurzform für If...Else...EndIf.

    AutoIt
    Local $a = 11, $b = 9, $x
    
    ; (expression) ? (expression1 if expression is True) : (expression2 if expression is False)
    $x = ($a > $b) ? ($a) : ($b) ; ==>> $x = $a
    
    If $a > $b Then
        $x = $a ; ==>> $x = $a
    Else
        $x = $b
    EndIf

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™