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

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • Bitnugger
    • 20. Dezember 2022 um 21:10
    Zitat von SOLVE-SMART

    Ich denke bereits über das Format nach, der Inhalt kommt dann von allein (hoffentlich 😅🤞 ).

    Ich würde über den Inhalt nachdenken... das Format ergibt sich dann quasi von selbst. ;)

  • Tool zur Suche nach Inhalten in .au3-Dateien

    • Bitnugger
    • 20. Dezember 2022 um 20:10
    Zitat von Peter S. Taler

    Brauchts ein Plugin oder kann er es von Haus aus?

    Das kann TC von Haus aus.

    Ich benutze übrigens TCUP, eine vorkonfigurierte Version von TC, bei der bereits etliche Erweiterungen installiert sind.

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • Bitnugger
    • 20. Dezember 2022 um 19:54

    Peter S. Taler hat es treffend formuliert und ich habe dem nichts hinzuzufügen... also her damit! 8o

  • Tool zur Suche nach Inhalten in .au3-Dateien

    • Bitnugger
    • 20. Dezember 2022 um 19:34

    In Dateien suchen (Alt+F7) mache ich am liebsten mit Total Commander...

    Bevor ich das kannte, habe ich es mit grep/egrep gemacht, das im Paket GnuWin enthalten ist:

    grep und egrep - Dateien rekursiv nach String durchsuchen

    Dateien rekursiv nach String durchsuchen Dateien rekursiv nach String durchsuchen

    Sucht man einen bestimmten String in einer Vielzahl an Dateien und Verzeichnissen könnten die folgenden Linux Befehle hilfreich sein.

    grep: durchsucht eine Datei nach einem Suchstring
    egrep: funktioniert wie grep, aber kann mit erweiterten regulären Ausdrücken umgehen
    find: sucht bestimmte Dateien und wendet Befehle auf diese an

    grep und egrep

    grep -r -i 'Suchstring' ./
    ./ das Verzeichnis, in dem die Dateien durchsucht werden sollen
    -r auch alle Unterverzeichnisse rekursiv nach 'Suchstring' durchsuchen
    -i Groß-/Kleinschreibung wird ignoriert

    Hat man als Suchstring einen erweiterten regulären Ausdruck, benutzt man einfach egrep.

    egrep -r -i 'Suchstring' ./

    find und grep

    Es gibt Linux Systeme, die das -r bei grep nicht unterstützen. Hier kann man sich mit find behelfen.

    find ./ -exec grep -i 'Suchstring' /dev/null {} \;

    Quelle: grep all files and sub-directories in a directory for a string

  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 10. Oktober 2022 um 20:50

    Alina

    So... bin ich zu dir... jetzt mit Edit-Control... 8o

    AutoIt: _Calc_DD.au3
    ;-- TIME_STAMP   2022-10-10 20:45:19
    
    ;~ #include <Array.au3> ; _ArrayToString
    #include <APIShellExConstants.au3>
    ;~ #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPISysWin.au3>
    
    Opt('TrayAutoPause', 0)
    
    Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
    Global $g_iID, $g_idEdit, $g_idDummy
    
    OnAutoItExitRegister('OnAutoItExit')
    
    _Main()
    
    Func _Main()
        Local $hWnd = GUICreate(@ScriptName, 640, 420)
        Local $aCS = WinGetClientSize($hWnd)
        $g_idEdit = GUICtrlCreateEdit('', 0, 0, $aCS[0], $aCS[1], BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_MULTILINE, $ES_READONLY))
        GUICtrlSetFont(-1, 11, 800, 0, 'Courier New')
        $g_idDummy = GUICtrlCreateDummy()
        GUISetState()
        WinSetOnTop($hWnd, '', 1)
        Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
        GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
    ;~     $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT, $SHCNRF_NEWDELIVERY), $g_sPath, 1)
        $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, _
                BitOR($SHCNE_ASSOCCHANGED, $SHCNE_CREATE, $SHCNE_RENAMEITEM, $SHCNE_UPDATEITEM), _ ; $SHCNE_CREATE ist eigtl. nur nötigt, wenn ausschließlich neue Dateien berücksichtig werden sollen!
                BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_NEWDELIVERY), _
                $g_sPath, 0)
        If @error Then
            MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
            Exit
        EndIf
    
        Local $sPath, $sCalc, $hFile
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $g_idDummy
                    $sPath = GUICtrlRead($g_idDummy)
                    $sCalc = _Calc(FileRead($sPath)) ; "32 94 97 64 83 14 82 64 72" ==>> "32 06 97 36 83 86 82 36 72"
                    $hFile = FileOpen(StringRegExpReplace($sPath, '(?i)(.+)\.rns', '\1.rnt'), 2)
                    FileWrite($hFile, $sCalc) ; Eine bereits vorhandene *.rnt wird hiermit überschrieben!
                    FileClose($hFile)
            EndSwitch
        WEnd
    EndFunc   ;==>_Main
    
    Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local Static $bCreate = False
        Local $aRes = DllCall("shell32.dll", "HANDLE", "SHChangeNotification_Lock", "wparam", $wParam, "lparam", $lParam, "ptr*", "", "ulong*", "")
    ;~     ConsoleWrite(@LF & "> SHChangeNotification_Lock   $aRes --> " & _ArrayToString($aRes, '|') & @LF)
        Local $PIDLIST_ABSOLUTE = $aRes[3]
        Local $plEvent = $aRes[4]
    
        Local $tPIDL = DllStructCreate('dword Item1; dword Item2', $PIDLIST_ABSOLUTE)
        Local $sPath1 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item1'))
        Local $sPath2 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item2'))
    
    ;~     ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sPath1 --> " & $sPath1 & @LF)
    ;~     ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sPath2 --> " & $sPath2 & @LF)
        Switch $plEvent
            Case $SHCNE_ASSOCCHANGED ; 0x8000000  A file type association has changed.
                _AppendText(@CRLF & 'Case $SHCNE_ASSOCCHANGED' & @CRLF)
            Case $SHCNE_CREATE       ; 0x00000002 A non-folder item has been created.
                $bCreate = True
            Case $SHCNE_RENAMEITEM   ; 0x00000001 The name of a non-folder item has changed.
                _AppendText(@CRLF & '! Case $SHCNE_RENAMEITEM' & @CRLF & _
                        '> Alter Name: ' & $sPath1 & @CRLF & _
                        '> Neuer Name: ' & $sPath2 & @CRLF)
                        ; zugehörige *.rnt umbenennen
            Case $SHCNE_UPDATEITEM   ; 0x00002000 An existing non-folder item has changed, but the item still exists and has not been renamed.
                If StringRight($sPath1, 4) = '.rns' Then
                    _AppendText(@CRLF & '! ' & ($bCreate ? 'Neue' : 'Geänderte') & ' *.rns gefunden!' & @CRLF & _
                            '> Event: 0x' & Hex($plEvent) & ' ($SHCNE_UPDATEITEM) ' & @CRLF & _
                            '> Pfad1: ' & $sPath1 & @CRLF)
                    _SendToDummy($g_idDummy, $sPath1)
                EndIf
                $bCreate = False
    ;~         Case Else ; We don't care...
        EndSwitch
    
        $aRes = DllCall("shell32.dll", "int", "SHChangeNotification_Unlock", "HANDLE", $aRes[0])
    ;~     ConsoleWrite("> SHChangeNotification_Unlock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
    EndFunc   ;==>WM_SHELLCHANGENOTIFY
    
    Func _SendToDummy($idDummy, $sPath)
        Local $iFileSize = FileGetSize($sPath)
        If $iFileSize Then
            _AppendText('+ Die Datei ist ' & $iFileSize & ' Bytes groß' & @CRLF & @CRLF)
            GUICtrlSendToDummy($g_idDummy, $sPath)
        Else
            _AppendText('! Die Datei ist leer!' & @CRLF & @CRLF)
        EndIf
    EndFunc   ;==>_SendToDummy
    
    ; Convert *.rns to *.rnt
    Func _Calc($sSource)
        Local $aArray = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
        For $i = 1 To UBound($aArray) - 1 Step 2
    ;~         $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], 100 - $aArray[$i])
            $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], StringRight(100 - $aArray[$i], 2))
        Next
        $sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i - 1] : StringTrimRight($sTarget, 1)
        _AppendText('> Vorher (*.rns) = ' & $sSource & @CRLF & '- Danach (*.rnt) = ' & $sTarget & @CRLF & @CRLF) ; *** nur zur Anzeige
        Return $sTarget
    EndFunc   ;==>_Calc
    
    Func _AppendText($sText)
        _GUICtrlEdit_AppendText($g_idEdit, $sText)
    EndFunc
    
    Func OnAutoItExit()
        If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen

    Dateien

    _Calc_DD.au3 5,57 kB – 289 Downloads
  • Background Bild und GUI Elemente

    • Bitnugger
    • 9. Oktober 2022 um 22:04
    Zitat von casi4712

    ja ich beziehe mich ja auch auf diesen Post, zumidest diese Zeile:

    If Round($iFreeSpace, 1) <> Round($iFree, 1) Then ; Eine Stelle hinter dem Komma vergleichen

    ist weder in deinem Vorschlag, noch in meinem Post, das hatte mich nur stutzig gemacht;)

    Verstehe dich nicht... die Zeile ist doch in Post #24... und davon reden wir doch, oder?

    Es geht doch lediglich darum, das GUICtrlSetData nur dann ausgeführt wird, wenn sich der freie Speicher geändert hat. Wenn das zu oft passiert, flackert das Label. Damit also nicht jede kleine Änderungen erfasst wird, kann man die Abfrage auf zwei oder nur eine Stelle hinter dem Komma begrenzen, oder auch nur die Zahlen vor dem Komma nehmen.

  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 9. Oktober 2022 um 21:36
    Zitat von fee

    fehlt ein #include <GUIConstantsEx.au3>

    Oh ja, habe ich nun hinzugefügt...

    Zitat von fee

    Eine RNS-Datei in einen andernen Dateityp umbenennen würde erkannt werden, umgekehrt jedoch nicht.

    Ja, will man das, muss die Abfrage entsprechen angepasst werden... den alten Namen bekommst du mit "Item1", den neuen mit "Item2".

    Zitat von fee

    $SHCNE_UPDATEITEM tritt laut Beschreibung nur bei Veränderung des Inhaltes eines Elementes auf, hier also nicht nötig.

    Wir benötigen ja nicht nur den Namen des Pfades, sondern vor allem auch den Inhalt der Datei... den es aber evtl. noch nicht gibt, nachdem die Datei erstellt wurde ($SHCNE_CREATE) - z.B. mit FileOpen("filename.rns", $FO_OVERWRITE) - hier greift dann $SHCNE_UPDATEITEM, nachdem die Daten geschrieben wurden!

    Da die Aufgabenstellung nur das Erkennen von neuen *.rns vorgibt, brauchen wir $SHCNE_CREATE und $SHCNE_UPDATEITEM, jedoch kein $SHCNE_ASSOCCHANGED. Das kann man natürlich auch noch abfragen, genauso wie $SHCNE_RENAMEITEM, wenn die Datei umbenannt wurde und nun vielleicht keine *.rns mehr ist. Das war aber nicht gefragt.

    Zitat von fee

    Den ersten Zitatsatz weiß ich leider nicht vollständig umzusetzen.

    So habe ich das verstanden:

    Durch $SHCNRF_NEWDELIVERY wird für empfangene Nachrichten gemeinsam genutzter Speicher verwendet. SHChangeNotification_Lock rufst du auf, um auf die eigentlichen Daten zuzugreifen. SHChangeNotification_Unlock rufst du auf, um den Speicher wieder freizugeben, wenn du fertig sind.


    Schau mal hier, wie KaFu das gelöst hat.

    Ansonsten... sehr schön umgesetzt. :rock:

    Hier noch meine Version - die *.rnt wird hiermit auch erstellt:

    AutoIt
    ;-- TIME_STAMP   2022-10-09 21:25:24
    
    ;~ #include <Array.au3> ; _ArrayToString
    #include <APIShellExConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPISysWin.au3>
    
    Opt('TrayAutoPause', 0)
    
    Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
    Global $g_iID, $g_idDummy
    
    OnAutoItExitRegister('OnAutoItExit')
    
    _Main()
    
    Func _Main()
        Local $hWnd = GUICreate(@ScriptName)
        $g_idDummy = GUICtrlCreateDummy()
        GUISetState()
        Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
        GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
    ;~     $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT, $SHCNRF_NEWDELIVERY), $g_sPath, 1)
        $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, _
                BitOR($SHCNE_ASSOCCHANGED, $SHCNE_CREATE, $SHCNE_RENAMEITEM, $SHCNE_UPDATEITEM), _
                BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_NEWDELIVERY), _
                $g_sPath, 0)
        If @error Then
            MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
            Exit
        EndIf
    
        Local $sPath, $sCalc, $hFile
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $g_idDummy
                    $sPath = GUICtrlRead($g_idDummy)
                    $sCalc = _Calc(FileRead($sPath)) ; "32 94 97 64 83 14 82 64 72" ==>> "32 06 97 36 83 86 82 36 72"
                    $hFile = FileOpen(StringRegExpReplace($sPath, '(?i)(.+)\.rns', '\1.rnt'), 2)
                    FileWrite($hFile, $sCalc)
                    FileClose($hFile)
            EndSwitch
        WEnd
    EndFunc   ;==>_Main
    
    Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $aRes = DllCall("shell32.dll", "HANDLE", "SHChangeNotification_Lock", "wparam", $wParam, "lparam", $lParam, "ptr*", "", "ulong*", "")
    ;~     ConsoleWrite(@LF & "> SHChangeNotification_Lock   $aRes --> " & _ArrayToString($aRes, '|') & @LF)
        Local $PIDLIST_ABSOLUTE = $aRes[3]
        Local $plEvent = $aRes[4]
    
        Local $tPIDL = DllStructCreate('dword Item1; dword Item2', $PIDLIST_ABSOLUTE)
        Local $sPath1 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item1'))
        Local $sPath2 = _WinAPI_ShellGetPathFromIDList(DllStructGetData($tPIDL, 'Item2'))
    
    ;~     ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sPath1 --> " & $sPath1 & @LF)
    ;~     ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sPath2 --> " & $sPath2 & @LF)
        Switch $plEvent
            Case $SHCNE_ASSOCCHANGED ; 0x8000000  A file type association has changed.
                ConsoleWrite(@CRLF & 'Case $SHCNE_ASSOCCHANGED' & @CRLF)
            Case $SHCNE_CREATE       ; 0x00000002 A non-folder item has been created.
                If StringRight($sPath1, 4) = '.rns' Then
                    ConsoleWrite(@CRLF & '! Neue *.rns gefunden!' & @CRLF & _
                            '> Event: 0x' & Hex($plEvent) & ' ($SHCNE_CREATE) ' & @CRLF & _
                            '> Pfad1: ' & $sPath1 & @CRLF)
                    _SendToDummy($g_idDummy, $sPath1)
                EndIf
            Case $SHCNE_RENAMEITEM   ; 0x00000001 The name of a non-folder item has changed.
                ConsoleWrite(@CRLF & '! Case $SHCNE_RENAMEITEM' & @CRLF & _
                        '> Alter Name: ' & $sPath1 & @CRLF & _
                        '> Neuer Name: ' & $sPath2 & @CRLF)
                        ; zugehörige *.rnt umbenennen
            Case $SHCNE_UPDATEITEM   ; 0x00002000 An existing non-folder item has changed, but the item still exists and has not been renamed.
                If StringRight($sPath1, 4) = '.rns' Then
                    ConsoleWrite(@CRLF & '! Geänderte *.rns gefunden!' & @CRLF & _
                            '> Event: 0x' & Hex($plEvent) & ' ($SHCNE_UPDATEITEM) ' & @CRLF & _
                            '> Pfad1: ' & $sPath1 & @CRLF)
                    _SendToDummy($g_idDummy, $sPath1)
                EndIf
    ;~         Case Else ; We don't care...
        EndSwitch
    
        $aRes = DllCall("shell32.dll", "int", "SHChangeNotification_Unlock", "HANDLE", $aRes[0])
    ;~     ConsoleWrite("> SHChangeNotification_Unlock $aRes --> " & _ArrayToString($aRes, '|') & @LF)
    EndFunc   ;==>WM_SHELLCHANGENOTIFY
    
    Func _SendToDummy($idDummy, $sPath)
        Local $iFileSize = FileGetSize($sPath)
        If $iFileSize Then
            ConsoleWrite('+ _SendToDummy: Die Datei ist '&$iFileSize&' Bytes gross ==>> ' & $sPath & @CRLF & @CRLF)
            GUICtrlSendToDummy($g_idDummy, $sPath)
        Else
            ConsoleWrite('! _SendToDummy: Die Datei ist leer! ==>> ' & $sPath & @CRLF & @CRLF)
        EndIf
    EndFunc   ;==>_SendToDummy
    
    Func _Calc($sSource)
        Local $aArray = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
        For $i = 1 To UBound($aArray) - 1 Step 2
    ;~         $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], 100 - $aArray[$i])
            $sTarget &= StringFormat('%02i' & $sSpace & '%02i' & $sSpace, $aArray[$i - 1], StringRight(100 - $aArray[$i], 2))
        Next
        $sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i - 1] : StringTrimRight($sTarget, 1)
        ConsoleWrite('> Vorher = ' & $sSource & @CRLF)         ; *** nur zur Anzeige
        ConsoleWrite('- Danach = ' & $sTarget & @CRLF & @CRLF) ; *** nur zur Anzeige
        Return $sTarget
    EndFunc   ;==>_Calc
    
    Func OnAutoItExit()
        If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen
  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 8. Oktober 2022 um 23:38
    Zitat von fee

    Am Anfang schriebst du, dass die Eingabezeichenfolge nur zweistellige Zahlen enthält. ...

    Genau...

    Ordnerüberwachung ist auch nicht schwierig...

    AutoIt
    #include <APIShellExConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPISysWin.au3>
    
    Opt('TrayAutoPause', 0)
    
    Global Const $g_sPath = @ScriptDir ; Die zu überwachenden Verzeichnisse (String oder Array)
    Global $g_iID
    
    OnAutoItExitRegister('OnAutoItExit')
    
    _Main()
    
    Func _Main()
        Local $hWnd = GUICreate('')
        GUISetState()
        Local $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
        GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
        $g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $g_sPath, 1)
        If @error Then
            MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', 'Das Fenster wurde nicht registriert.')
            Exit
        EndIf
    
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    EndFunc   ;==>_Main
    
    Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local Static $bCreate = False
        Local $sPath = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item1'))
        If $sPath Then
            If $bCreate And ($lParam = $SHCNE_UPDATEITEM) Then ; 0x00002000 - nach $SHCNE_CREATE folgt immer ein $SHCNE_UPDATEITEM!
                If StringRight($sPath, 4) = '.rns' Then
                    ConsoleWrite('! Neue *.rns gefunden!' & @CRLF)
                    ConsoleWrite('> Event: 0x' & Hex($lParam) & ' ($SHCNE_UPDATEITEM) | Pfad: ' & $sPath & @CRLF)
                EndIf
            EndIf
            $bCreate = $lParam = $SHCNE_CREATE ; 0x00000002
        Else
            ConsoleWrite('@ Event: 0x' & Hex($lParam) & @CRLF)
        EndIf
    EndFunc   ;==>WM_SHELLCHANGENOTIFY
    
    Func OnAutoItExit()
        If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen
  • Background Bild und GUI Elemente

    • Bitnugger
    • 8. Oktober 2022 um 16:48
    Zitat von casi4712

    Diese beiden Zeilen sind in dem Script nicht vorhanden

    Das bezieht sich natürlich auf die Funktion in Post #24... wobei dein Quote so nicht richtig ist.

    Welche Zeile? Eine von diesen hier; welche, ist deine Wahl.

    If $iFreeSpace <> $iFree Then ; Zwei Stellen hinter dem Komma vergleichen

    If Int($iFreeSpace) <> Int($iFree) Then ; Nur Ganzzahlen vergleichen

    If Round($iFreeSpace, 1) <> Round($iFree, 1) Then ; Eine Stelle hinter dem Komma vergleichen

  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 8. Oktober 2022 um 15:12
    Zitat von fee

    Und wie erledigst du dann die Umwandlung des Arrays in einen String ohne zweite Schleife, vor allem wenn die Anzahl der Doppelziffern ungerade ist?

    So würde ich es dann machen:

    AutoIt
    _Calc('32 94 97 64 83 14 82 64 72')
    _Calc('32 94 97 64 83 14 82 64')
    _Calc('329497648314826472')
    _Calc('3294976483148264')
    
    Func _Calc($sSource)
        Local $aArray  = StringRegExp($sSource, '(\d{2})\s?', 3), $sSpace = StringInStr($sSource, ' ') ? ' ' : '', $sTarget
        For $i = 1 To UBound($aArray) -1 Step 2
            $sTarget &= StringFormat('%02i'&$sSpace&'%02i' & $sSpace, $aArray[$i -1], 100 - $aArray[$i])
        Next
        $sTarget = $i = UBound($aArray) ? $sTarget & $aArray[$i -1] : StringTrimRight($sTarget, 1)
        ConsoleWrite('> Vorher = ' & $sSource & @CRLF) ; *** nur zur Anzeige
        ConsoleWrite('- Danach = ' & $sTarget & @CRLF) ; *** nur zur Anzeige
        ConsoleWrite(@CRLF)
        Return $sTarget
    EndFunc
    Alles anzeigen
  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 8. Oktober 2022 um 13:33
    Zitat von AspirinJunkie

    Na gut, bei so vielen Lösungen fehlt ja eigentlich nur noch der obligatorische Einzeiler:

    :klatschen::rofl:

  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 8. Oktober 2022 um 13:23
    Zitat von fee

    If Mod($i, 2) = 0 Then _ ; Jeder zweite Eintrag

    Das kannst du auch direkt mit dem For erledigen...

    For $i = 1 To $Array[0] Step 2

  • StringReplace nur auf jede 2. Doppelziffe anwenden

    • Bitnugger
    • 8. Oktober 2022 um 13:14

    So geht es auch:

    AutoIt
    #include <StringConstants.au3>
    
    _Calc("32 94 97 64 83 14 82 64 72") ; ==>> 32 06 97 36 83 86 82 36 72
    _Calc("329497648314826472")         ; ==>> 320697368386823672
    
    Func _Calc($sEingangsstring)
        Local $aRx = StringRegExp($sEingangsstring, '\d{2}', $STR_REGEXPARRAYGLOBALMATCH)
        Local $sAusgangsstring, $sSpace = StringInStr($sEingangsstring, ' ') ? ' ' : ''
        For $i = 0 To UBound($aRx) -1 Step 1
            $sAusgangsstring &= StringFormat('%02i%s', (Mod($i, 2) ? 100 - $aRx[$i] : $aRx[$i]), $sSpace)
        Next
        ConsoleWrite('> $sEingangsstring : ' & $sEingangsstring & @CRLF)
        ConsoleWrite('- $sAusgangsstring : ' & $sAusgangsstring & @CRLF & @CRLF)
        Return $sAusgangsstring
    EndFunc
    Alles anzeigen
  • Overheadarmes/Codearmes Keyboard capturing

    • Bitnugger
    • 6. Oktober 2022 um 21:34

    _WinAPI_GetKeyboardState() fällt mir da noch ein...

  • Background Bild und GUI Elemente

    • Bitnugger
    • 5. Oktober 2022 um 21:51
    Zitat von casi4712

    ich hatte Deinen Ansatz auch probiert Bit, ebenfalls das selbe.

    Ich hatte AdlibRegister auf 1000 gesetzt und bei mir ist der Effekt nicht zu sehen... das Label wird bei mir auch nur etwa 1x / Std. geändert.

    AutoIt
    Func _Testspace()
        Local $iFree = Round(DriveSpaceFree($sSystemDrive) / 1024, 2)
        If $iFreeSpace <> $iFree Then
            ConsoleWrite('_Testspace('&$iFree&' GB)' & @CRLF)
            $iFreeSpace = $iFree
            GUICtrlSetData($idLabelSpace, 'Freier Speicher auf SystemDrive ('&$sSystemDrive&')' & ($iFree < $SW ? ' wird knapp!: ' : ' : ') & $iFree & ' GB')
        EndIf
    EndFunc   ;==>_Testspace

    Wenn das bei dir viel öfter passiert, dann ändere die Funktion so ab:

    AutoIt
    ;~     If $iFreeSpace <> $iFree Then ; Zwei Stellen hinter dem Komma vergleichen
        If Int($iFreeSpace) <> Int($iFree) Then ; Nur Ganzzahlen vergleichen
    ;~     If Round($iFreeSpace, 1) <> Round($iFree, 1) Then ; Eine Stelle hinter dem Komma vergleichen
  • Background Bild und GUI Elemente

    • Bitnugger
    • 5. Oktober 2022 um 20:44
    Zitat von casi4712

    Dafür is der schwarze Balken wieder da, wenn die BEdingung erfült ist und er das Label zeigen soll.

    Klar, wenn du 10 x pro Sekunde den Text des Labels änderst, dann flackert es... in meinem letzten Script habe ich es so geändert, das nur dann der neue Text (bzw. Zahl) geschrieben wird, wenn er sich geändert hat. Ist dir wohl entgangen...

  • Background Bild und GUI Elemente

    • Bitnugger
    • 4. Oktober 2022 um 20:13
    Zitat von casi4712

    Mir ist noch ein ähnlicher Effekt aufgefallen,

    den du sebst verursachst... du hast da ein paar fette Fehler drin... hier mal eine "leicht" korrigierte Version...

    PS: GuiCtrlSetOnHover_UDF.au3 ist bei mir GuiCtrlOnHover.au3

    AutoIt
    ;-- TIME_STAMP   2022-10-04 20:09:25
    
    #include-once
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <Constants.au3>
    #include <EditConstants.au3>
    #include <FontConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <StaticConstants.au3>
    #include <StringConstants.au3>
    #include <WindowsConstants.au3>
    
    #include <Array.au3>
    #include <Date.au3>
    #include <GDIPlus.au3>
    #include <String.au3>
    #include <WinAPIGdiDC.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPISysInternals.au3>
    #include <WinApi.au3>
    
    #include "GUIBkImage.au3"
    #include "Services.au3"
    #include <GuiCtrlOnHover.au3>
    
    ;~ FileInstall("C:\Users\user\Pictures\scr09082022-084252.bmp", "C:\Windows\Temp\hg.bmp", 1)
    ;~ FileInstall("F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\Tricia Helfer\Tricia Helfer 03.bmp", "F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\!-Unsortiert\Adriana Slenkaja.bmp", 1)
    
    Opt('MustDeclareVars', 1)
    ;Opt("TrayAutoPause", 0)
    
    Global $ActiveCheck, $result
    Global $ARRAY_COLOR_TOP_MIN[3] = [36, 65, 142]
    Global $ARRAY_COLOR_TOP_MAX[3] = [11, 42, 122]
    Global $idLbl_Close = 1
    Global $ROUNDES = 20, $LastHwnd = 0
    Global $LastHwnd
    Global $GUIBKCOLOR = 0x738599
    Global $SubBack = 0xEAF0E2
    Global $idPic
    Global $SW = 20 ; GB
    Global Const $sSystemDrive = StringLeft(@WindowsDir, 2) ; SystemDrive auslesen
    Global $iFreeSpace = 0
    Global $idLabelSpace, $labelTemp, $temp
    Global $aPics = ['F:\Eigene Dateien\Pictures\GIRLS\Girls - Real\Tricia Helfer\Tricia Helfer 03.bmp', 'F:\Eigene Dateien\Pictures\GIRLS\Girls - Cyber\Kim_02.bmp']
    
    AdlibRegister('_Testspace', 1000)
    
    Global $hGui = RBoxCreate("Integrator 4 Release 076", 840, 625)
    
    While True
        CheckX($hGui, $idLbl_Close, 0xA3A3A3, 0x555555)
    
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idLbl_Close
                GUIDelete($hGui)
                AdlibUnRegister('_Testspace')
                Exit
        EndSwitch
    WEnd
    
    Func RBoxCreate($sTitle, $width, $height, $left = -1, $top = -1, $show = 1)
        Local $hGUI = GUICreate($sTitle, $width, $height, $left, $top, $WS_POPUP)
        _GuiRoundCorners($hGUI, 0, 0, $ROUNDES, $ROUNDES)
    
        $idPic = GUICtrlCreatePic($aPics[0], 0, 25, 920, 660)
        GUICtrlSetState(-1, $GUI_DISABLE)
        GUISetBkColor($GUIBKCOLOR, $hGUI)
    
    ;~     _createButtons()
    ;~     _createLabels()
    
        $idLbl_Close = GUICtrlCreateLabel('X', $width - 20, 3, 25, 25)
        GUICtrlSetCursor($idLbl_Close, 0)
        GUICtrlSetBkColor($idLbl_Close, -2)
        GUICtrlSetFont($idLbl_Close, 15, 800)
        GUICtrlSetColor($idLbl_Close, 0x555555)
    
        $sTitle &= " "
        Local $idTitle = GUICtrlCreateLabel($sTitle, 0, 0, $width - 20, 26, $SS_CENTER, $GUI_WS_EX_PARENTDRAG) ; "Integrator 4 Release 076 "
        GUICtrlSetFont($idTitle, 17, 400, 0, "Consolas")
        GUICtrlSetBkColor($idTitle, -2)
    
        $idLabelSpace = GUICtrlCreateLabel('', 5, 600, 370, 20)
        GUICtrlSetColor(-1, 0xF00404)   ; red
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetFont(-1, 10, 100)   ; bold
    
        GUICtrlSetState(GUICtrlCreateGraphic(0, 0, $width, 25), $GUI_DISABLE) ; Wofür soll das gut sein?
    
        If $show = 1 Then GUISetState(@SW_SHOW, $hGUI)
    
        Return $hGUI
    EndFunc   ;==>RBoxCreate
    
    Func _Testspace()
        ConsoleWrite('_Testspace()' & @CRLF)
        Local $iFree = Round(DriveSpaceFree($sSystemDrive) / 1024, 2)
        If $iFreeSpace <> $iFree Then
            $iFreeSpace = $iFree
    
            GUICtrlSetData($idLabelSpace, 'Freier Speicher auf SystemDrive:' & ($iFree < $SW ? ' wird knapp!: ' : ' ') & $iFree & ' GB')
        EndIf
    EndFunc   ;==>_Testspace
    
    Func CheckX($hGui, $CtrlID, $sCMD, $eCMD)
        Local $aCursorInfo = GUIGetCursorInfo($hGui)
        If @error Then Return 0
        If $LastHwnd <> $aCursorInfo[4] Then
            $LastHwnd = $aCursorInfo[4]
            Return GUICtrlSetColor($idLbl_Close, $aCursorInfo[4] = $CtrlID ? $sCMD : $eCMD)
        EndIf
    EndFunc   ;==>CheckX
    ;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
        Dim $pos, $ret
        $pos = WinGetPos($h_win)
        $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
        If $ret[0] Then
            $ret = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
            Return $ret[0] ? 1 : 0
        EndIf
        Return 0
    EndFunc   ;==>_GuiRoundCorners
    
    ;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    Func GradientFill($im, $x1, $y1, $width, $height, $left_color, $right_color)
        Local $color0 = ($left_color[0] - $right_color[0]) / $height, $color1 = ($left_color[1] - $right_color[1]) / $height
        Local $color2 = ($left_color[2] - $right_color[2]) / $height
        For $Y = 0 To $height - 1
            Local $red = $left_color[0] - Floor($Y * $color0)
            Local $green = $left_color[1] - Floor($Y * $color1)
            Local $blue = $left_color[2] - Floor($Y * $color2)
            Local $col = Dec(Hex($blue, 2) & Hex($green, 2) & Hex($red, 2))
            GUICtrlSetGraphic($im, $GUI_GR_COLOR, $col)
            GUICtrlSetGraphic($im, $GUI_GR_MOVE, 0, $Y)
            GUICtrlSetGraphic($im, $GUI_GR_LINE, $width, $Y)
        Next
        GUICtrlSetGraphic($im, $GUI_GR_COLOR, 0x000000)
        GUICtrlSetGraphic($im, $GUI_GR_MOVE, 0, $height)
        GUICtrlSetGraphic($im, $GUI_GR_LINE, $width, $height)
        GUICtrlSetGraphic($im, $GUI_GR_REFRESH)
    EndFunc   ;==>GradientFill
    ;-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    Alles anzeigen
  • Background Bild und GUI Elemente

    • Bitnugger
    • 2. Oktober 2022 um 20:08
    Zitat von casi4712

    GUIDelete($hGui)

    Nach dieser Zeile muss ein Exit folgen... denn ohne GUI gibt es auch keine Msg und dein Script funktioniert somit nicht mehr korrekt.

    Zitat von casi4712

    local $gMsg = GUIGetMsg()

    Außerhalb einer Funktion sind alle Variablen Global und es ist dabei völlig egal, ob du sie mit Local oder Global deklarierst!

    Zudem sollte die Deklaration besser vor dem While stehen. In deinem Fall ist die Variable aber eh überflüssig, weil du sie ja lediglich einmalig für Switch benötigst... da kannst du es besser so machen:

    Switch GUIGetMsg()

  • Background Bild und GUI Elemente

    • Bitnugger
    • 2. Oktober 2022 um 19:10
    Zitat von casi4712

    das lauffähige Beispiel hatte ich doch gepostet, ich habe es doch auch entsprechend den Vorschlägen von Mombass gepostet! Da er ja gesagt hatte, er konnte das Problem nachvollziehen, kann ich nun Deine Einlassung nicht ganz nachvollziehen. Soll ich den Inhalt von den UDFs posten, meinst Du das? Oder das Hintergrundbild? Ich hatte es mit meheren Bildern und Formaten probiert,

    ...aber es hat nicht funktioniert.

    Hm, ja, das ist dann natürlich schwierig bis unmöglich für dich und auch nicht dein Vergehen, wenn das Forum Zicken wegen zu großer Dateianhänge macht.

    Solange Gun-Food das nicht gefixt hat, geht das wohl nicht so, wie Musashi es empfohlen hat. Bis dahin kannst du als Workaround einfach den Inhalt der UDFs posten; aber setzte sie in Code-Tags! Mit Bildern ist es schwieriger... verkleinere sie einfach, damit der Upload klappt, oder verwende Bilder, die mit AutoIt installiert wurden, z.B.: "c:\Program Files (x86)\AutoIt3\Examples\Helpfile\Extras\Compass.bmp"

  • Background Bild und GUI Elemente

    • Bitnugger
    • 2. Oktober 2022 um 18:51
    Zitat von casi4712
    AutoIt
    $BG = ('C:\Windows\Temp\hg.bmp', 0, 25, 920, 660)
        GUICtrlCreatePic ($BG)

    Hust... was soll dass denn werden? :/

    So macht es Sinn:

    $BG = GUICtrlCreatePic('C:\Windows\Temp\hg.bmp', 0, 25, 920, 660)


    Zitat von casi4712
    AutoIt
    global $combo1 = GUICtrlCreateCombo ("Scripte", 300, 557, 150, 120)
    global $btnStart = GUICtrlCreateButton("🟥", 450, 557, 23, 23)

    Die Deklarationen von globalen Variablen gehören nicht in eine Funktion!

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™