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

  • Funktionsname inkl. Parameter mit RegEx filtern

    • Bitnugger
    • 14. Mai 2019 um 21:12

    Hallo liebe Leute,

    ich reiße mir nun schon seit Stunden ein Bein aus, bekomme es aber nicht hin, einen Funktionsname inkl. Parameter mit RegEx so zu filtern, dass es in allen Fällen passt.

    Hier das Ergebnis meiner bisherigen Versuche...

    Code
    #include <StringConstants.au3>
    
    _Strip(0, 'Func _CloseInputGUI(_Test(), _Test ( ) ) ; ENABLE $g_hMainGUI; Eingegebene Daten uebernehmen, wenn kein Fehler bei der Eingabe (IP-Adresse)' & @CRLF)
    _Strip(1, 'Func _SciTE_ShowFuncName()')
    _Strip(2, 'Func _SciTE_ShowFuncName ( ) ')
    _Strip(3, 'Func _SciTE_ShowFuncName (";");')
    _Strip(4, 'Func _SciTE_ShowFuncName (";"); ')
    _Strip(5, 'Func _SciTE_ShowFuncName (";") ; ')
    _Strip(6, 'Func _SciTE_ShowFuncName()' & @CRLF)
    _Strip(7, 'Func _SciTE_ShowFuncName(1)' & @CRLF)
    _Strip(8, 'Func _SciTE_ShowFuncName() ; () blabla' & @CRLF)
    _Strip(9, 'Func _SciTE_ShowFuncName(_AddComment(";" & $aComment[Random(0, 1, 1)])) ; () blabla' & @CRLF)
    
    Func _Strip($iNum, $sData)
        Local $sRxPattern = '^Func\s(.*\)(?:\s+)?(?:;)?(?:.*)?(?:\R+)?)$'
    
        $sStrip = StringRegExpReplace($sData, $sRxPattern, '\1')
        $sStrip = @extended ? $sStrip : 'RegEx-Error!'
        ConsoleWrite((@extended ? "- " : "! ") & $iNum & @TAB & "StringRegExpReplace : '" & $sStrip & "'" & @CRLF)
    
        $aRX = StringRegExp($sData, $sRxPattern, $STR_REGEXPARRAYMATCH) ; mit Parameter
        $sStrip = @error ? 'RegEx-Error!' : $aRX[0]
        ConsoleWrite((@error ? "! " : "> ") & $iNum & @TAB & "StringRegExp        : '" & $sStrip & "'" & @CRLF)
    EndFunc
    Alles anzeigen

    Das Ergebnis sollte aber so aussehen...

    Funktionsname.png

  • Fortlaufende Nummerierung neuer Dateien

    • Bitnugger
    • 2. Mai 2019 um 01:15

    Wer noch einen drauf legen will, fügt anstelle Opt('MustDeclareVars', 1) folgende Zeile ein:

    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

    Code
    Syntax: 
    
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 
    
    The parameters set the app behaviour as follows: 
    
    ·     -q         : quiet mode (this will only show errors and warnings) 
    ·     -d         : set the "MustDeclareVars" option to True 
    ·     -w 1      : give a warning if an include file is included more than once 
    ·     -w 2      : give a warning if #comments-end (or #ce) is missing 
    ·     -w 3      : give a warning if variables are already declared 
    ·     -w 4      : give a warning if local variables are used in the global scope 
    ·     -w 5      : give a warning if a local variable is declared but not used 
    ·     -w 6      : give a warning when using Dim 
    ·     -w 7      : give a warning if ByRef parameters are incorrect 
    Alles anzeigen
  • Fortlaufende Nummerierung neuer Dateien

    • Bitnugger
    • 29. April 2019 um 15:37

    Hier mal ein "auf die Schnelle geschriebenes" Beispiel, das zeigt, warum ich dazu rate, Laufvariablen nicht im globalen Kontext zu benutzen.

    C: _Example.au3
    #include <File.au3>
    ; Nun nehmen wir mal an, hier werden noch ca. 50 weitere Dateien included...
    #include "_Laufvariablen.au3"
    ;~ #include "..."
    
    _Example()
    
    Func _Example()
        $aFiles = _FileListToArrayRec(@DesktopDir, '*.xyz', $FLTA_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
        ConsoleWrite(@CRLF & '- _Example() : UBound($aFiles) = ' & UBound($aFiles) & @CRLF)
        If UBound($aFiles) Then $iCount = $aFiles[0]
        ; ...
        If IsDeclared('iCount') Then
            ConsoleWrite('! _Example() : Es wurden ' & $iCount & ' Datei' & ($iCount > 1 ? 'en' : '') & ' mit der Endung *.xyz gefunden!' & @CRLF & @CRLF & _
                '> _Example() : Ops... wieso ist $iCount deklariert und hat einen Wert > 0, obwohl UBound($aFiles) = 0 ist?' & @CRLF & @CRLF & _
                '! _Example() : $iCount = ' & $iCount & ' Scope = ' & (IsDeclared('iCount') = 1 ? '1 ($DECLARED_GLOBAL)' : IsDeclared('iCount') = -1 ? '-1 ($DECLARED_LOCAL)' : '0 ($DECLARED_UNKNOWN)') & @CRLF & @CRLF)
        EndIf
    EndFunc
    
    ; ...
    Alles anzeigen
    Code: _Laufvariablen.au3
    #include-once
    
    For $iCount = 1 To Random(1, 256, 1) Step 1
    Next

    Der Fehler kann nur in einem der Includes stecken... aber in welchem der ca. 50 Includes wurde $iCount als globale Variable deklariert?

  • sortierbare Tabelle (ListView) auslesbar gestalten

    • Bitnugger
    • 21. April 2019 um 17:10

    ControlListView ist für meine Begriffe jedoch eine Funktion, die ich nur nutze, wenn sonst nichts geht.

    Um die Attribute eines Items ($LVIS_FOCUSED, $LVIS_SELECTED, ...) zu ermitteln, gibt es einige Funktionen... doch weil ich mir die nicht alle merken will, habe ich mir für meine Projekte eine eigene Funktion gebastelt, mit der ich jeden beliebigen Status aller Items ermitteln kann.

    Code: _GUICtrlListView_GetItemAttributes.au3
    ;-- TIME_STAMP   2019-04-21 16:49:05   v 0.1
    
    #include-once
    
    Global Const $LVIS_VISIBLE = 0x1000, $LVIS_CHECKED = 0x2000
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GUICtrlListView_GetItemAttributes
    ; Description ...: Determines the specified status of all items
    ; Syntax ........: _GUICtrlListView_GetItemAttributes($hWnd, $iState)
    ; Parameters ....: $hWnd                - Control ID/Handle to the control
    ;                  $iState              - Status to be determined - can be linked with BitOR
    ; Return values .: Success: 1D-Array with the status of all items
    ;                           $aStates[$n] > 0 - if $iState = True
    ;                           $aStates[$n] = 0 - if $iState = False
    ; ...............: Failure: False and set @error to 1
    ; Author ........: Bitnugger
    ; Modified ......:
    ; Remarks .......: This special function uses _GUICtrlListView_GetItemEx and _GUICtrlListView_IsItemVisible (undocumented)!!!
    ;                  UDF-Flags  : $LVIS_CUT (0x0004), $LVIS_DROPHILITED (0x0008), $LVIS_FOCUSED (0x0001),
    ;                               $LVIS_OVERLAYMASK (0x0F00), $LVIS_SELECTED (0x0002), $LVIS_STATEIMAGEMASK (0xF000)
    ;                  User-Flags : $LVIS_VISIBLE (0x1000), $LVIS_CHECKED (0x2000) (Added by Bitnugger!!!)
    ; Related .......: _GUICtrlListView_GetItemChecked, _GUICtrlListView_GetItemCut, _GUICtrlListView_GetItemDropHilited,
    ;                  _GUICtrlListView_GetItemEx, _GUICtrlListView_GetItemFocused, _GUICtrlListView_GetItemSelected,
    ;                  _GUICtrlListView_GetItemState, _GUICtrlListView_IsItemVisible
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _GUICtrlListView_GetItemAttributes($hWnd, $iState)
        Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd), $iStateCount = 0
        If Not $iItemCount Then Return SetError(1, 0, False)
    
        Local $aStates[$iItemCount], _
            $tLVITEM, $fEx = BitAND($iState, $LVIS_FOCUSED, $LVIS_SELECTED, $LVIS_CUT, $LVIS_DROPHILITED, $LVIS_OVERLAYMASK, $LVIS_STATEIMAGEMASK), _
            $bVisible, $fVisible = BitAND($iState, $LVIS_VISIBLE), $bChecked, $fChecked = BitAND($iState, $LVIS_CHECKED), $bMatch
    
        If $fEx Then
            $tLVITEM = DllStructCreate($tagLVITEM)
            DllStructSetData($tLVITEM, "Mask", $LVIF_STATE)
            DllStructSetData($tLVITEM, "StateMask", BitAND($iState, $LVIS_VISIBLE))
        EndIf
    
        For $i = 0 To $iItemCount - 1
            $bMatch = False
    
            If $fEx Then ; $LVIS_FOCUSED, $LVIS_SELECTED, $LVIS_CUT, $LVIS_DROPHILITED, $LVIS_OVERLAYMASK, $LVIS_STATEIMAGEMASK
                DllStructSetData($tLVITEM, "Item", $i)
                _GUICtrlListView_GetItemEx($hWnd, $tLVITEM)
                $aStates[$i] = DllStructGetData($tLVITEM, "State")
                If BitAND($fEx, $aStates[$i]) Then $bMatch = True
            EndIf
    
            If $fVisible Then ; $LVIS_VISIBLE
                $bVisible = _GUICtrlListView_IsItemVisible($hWnd, $i) ; NO_DOC_FUNCTION !!!
                If $bVisible Then
                    $bMatch = True
                    $aStates[$i] = BitOR($aStates[$i], $LVIS_VISIBLE)
                EndIf
            EndIf
    
            If $fChecked Then ; $LVIS_CHECKED
                $bChecked = _GUICtrlListView_GetItemChecked($hWnd, $i)
                If $bChecked Then
                    $bMatch = True
                    $aStates[$i] = BitOR($aStates[$i], $LVIS_CHECKED)
                EndIf
            EndIf
    
            If $bMatch Then $iStateCount += 1
        Next
    
        Return SetExtended($iStateCount, $aStates)
    EndFunc  ;==>_GUICtrlListView_GetItemAttributes
    Alles anzeigen

    Dateien

    _GUICtrlListView_GetItemAttributes.au3 3,52 kB – 331 Downloads
  • sortierbare Tabelle (ListView) auslesbar gestalten

    • Bitnugger
    • 21. April 2019 um 12:12
    Zitat von Musashi

    _GUICtrlListView_SortItems($hListView, GUICtrlGetState($idListView))

    Da hast du wieder mal gut aufgepasst, mein Freund - habe es korrigiert! 8o

  • sortierbare Tabelle (ListView) auslesbar gestalten

    • Bitnugger
    • 20. April 2019 um 22:05

    Wenn du anstelle von

    $iSelected = GUICtrlRead($hListView)

    $iSelected = ControlListView($hListView, '', '', 'GetSelected', $iOption) ; $iOption = 0 nur erstes selektiertes Item, $iOption = 1 alle selektierten Items e.g: Item1|Item2|Item3

    nimmst, dann funktioniert es...

    C
    #include-once
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global $hGUI, $ThrottleButton, $ThrottleID, $ThrottleSteps, $ThrottleMin, $ThrottleMax, $idListView, $hListView
    Global $aLV, $iOption = 0, $iSelected, $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
    
    $hGUI = GUICreate("ListView", 405, 230)
    
    $idListView = GUICtrlCreateListView("ID|Name|Min|Max", 10, 10, 385, 180, -1)
    $hListView  = GUICtrlGetHandle($idListView)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $iExListViewStyle)
    $ThrottleButton = GUICtrlCreateButton("Lesen:", 10, 200, 100, 20)
    $ThrottleID     = GUICtrlCreateInput("", 120, 200, 65, 20)
    $ThrottleSteps  = GUICtrlCreateInput("", 120 + 1 * 70, 200, 65, 20)
    $ThrottleMin    = GUICtrlCreateInput("", 120 + 2 * 70, 200, 65, 20)
    $ThrottleMax    = GUICtrlCreateInput("", 120 + 3 * 70, 200, 65, 20)
    
    GUICtrlCreateListViewItem("90|more_a|0|1" , $idListView)
    GUICtrlCreateListViewItem("7|more_s|0|1"  , $idListView)
    GUICtrlCreateListViewItem("6|more_se|0|1" , $idListView)
    GUICtrlCreateListViewItem("5|more_f|0|1"  , $idListView)
    GUICtrlCreateListViewItem("4|more_v|0|2"  , $idListView)
    GUICtrlCreateListViewItem("3|more_d|-1|1" , $idListView)
    GUICtrlCreateListViewItem("2|more_z|0|80" , $idListView)
    GUICtrlCreateListViewItem("1|more_e|0|100", $idListView)
    
    GUISetState(@SW_SHOW)
    
    _GUICtrlListView_RegisterSortCallBack($hListView)
    
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idListView
                ; Kick off the sort callback
                _GUICtrlListView_SortItems($hListView, GUICtrlGetState($idListView))
            Case $ThrottleButton
                $iSelected = ControlListView($hListView, '', '', 'GetSelected', $iOption) ; $iOption = 0 nur erstes selektiertes Item, $iOption = 1 alle selektierten Items e.g: Item1|Item2|Item3
                $aLV = _GUICtrlListView_GetItemTextArray($hListView, $iSelected)
                GUICtrlSetData($ThrottleID, $aLV[1])
                GUICtrlSetData($ThrottleSteps, $aLV[2])
                GUICtrlSetData($ThrottleMin, $aLV[3])
                GUICtrlSetData($ThrottleMax, $aLV[4])
                ; MsgBox(0,"Ergebnis:",$iSelected & $aLV[1] & $aLV[2] & $aLV[3] & $aLV[4])
        EndSwitch
    WEnd
    
    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    GUIDelete()
    Alles anzeigen

    Schau dir in der AutoIt-Hilfe aber auch mal das Beispiel zu der Funktion _GUICtrlListView_Create an.

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

    • Bitnugger
    • 16. April 2019 um 21:03

    _GUICtrlListView_SimpleSort()

    So viele Fehler bei so wenig Text - das ist schon hohe Kunst! 8o

    So würde ich es übersetzen:

    C
    _GUICtrlListView_SimpleSort
    
    Sortiert ein ListView-Control (begrenzt)
    
    #include <GuiListView.au3>
    _GUICtrlListView_SimpleSort ( $hWnd, ByRef $vSortSense, $iCol [, $bToggleSense = True] )
    
    Parameters
    $hWnd              Control-ID / Handle des Controls ; in der englischen Hilfe steht hier nur "Handle to the control", was aber falsch ist - mit der ID geht es auch!
    
    $vSortSense        Legt die definierte Sortierreihenfolge fest
                           True - Absteigend sortieren (Descending)
                           False - Aufsteigend sortieren (Ascending)
                       Verwenden Sie eine einfache Variable für ein ListView mit einer einzelnen Spalte
                       Verwenden Sie ein Array für mehrspaltige ListViews:
                           $aArray[0] - Reihenfolge für die erste Spalte
                           $aArray[1] - Reihenfolge für die zweite Spalte
                           $aArray[n] - Reihenfolge für letzte Spalte
    
    $iCol            Spaltennummer
    
    $bToggleSense    [optional] Sortierrichtung umschalten
                         True - Sortierrichtung nach Sortierung umschalten (Standardeinstellung)
                         False - Sortierrichtung nach Sortierung unverändert
    
    Bemerkungen
    Das Umschalten der Sortierrichtung ist normal, wenn die Sortierung durch Klicken auf die Spaltenüberschrift eingeleitet wird.
    Der Benutzer kann dieses Umschalten verhindern, indem $bToggleSense auf False gesetzt wird, wenn die Funktion von anderswo aufrufen wird.
    
    Wenn die Funktion von mehreren Funktionen aufgerufen wird und die Sortierrichtung dabei umgeschaltet werden soll, ist es wichtig, dass $vSortSense als globale Variable deklariert ist. Ansonsten wird die Sortierrichtung jedes Mal zurückgesetzt, wenn $vSortSense als lokale Variable erstellt wird, und das Umschalten ist unwirksam.
    Alles anzeigen
  • Anfänger braucht Hilfe bei DropDown Listen

    • Bitnugger
    • 7. April 2019 um 13:09

    Zu [CLASS:#32770]

    https://docs.microsoft.com/de-de/windows/…-window-classes

    --> #32770 The class for a dialog box.

    Zu WinWait("[CLASS:#32770]")

    Damit wartest du - im schlimmsten Fall unendlich lange - auf eine DialogBox, egal von welchem Programm, egal welcher Titel und alles Andere ist auch egal... nur die Klasse muss stimmen.

    Stricken wir das mal etwas um und wartet nicht auf ein Fenster, sondern auf einen Zug der DB...

    ZugWait("[CLASS:ICE]")

    Damit wartest du - im schlimmsten Fall unendlich lange - auf einen Zug, egal von wo er kommt, egal wohin und wann er fährt und alles Andere ist auch egal... es muss nur ein ICE sein.

    Und wenn er nicht gestorben ist, wartet er heute noch auf seinen Zug... 8o

    So ist es um Klassen besser: (Klassen...:rofl:)

    Code
    Local $hWnd = WinWait("[TITLE:Sound; CLASS:#32770]", "Wählen Sie ein Aufnahmegerät aus, um die Einstellungen zu ändern:", 10) ; Max. 10 Sekunden auf das Fenster warten
    If Not IsHWnd($hWnd) Then Exit 1
    ConsoleWrite("$hWnd  --> " & $hWnd & @CRLF)
    Local $idCtrl = 1000, $sText = "", $hCtrl = ControlGetHandle($hWnd, $sText, $idCtrl) ; oder einfach ControlGetHandle($hWnd, "", 1000)
    If Not IsHWnd($hCtrl) Then Exit 2
    ConsoleWrite("$hCtrl --> " & $hCtrl & @CRLF)
    ; ...

    Zu Opt("WinWaitDelay", 1000)

    EN: Alters how long a script should briefly pause after a successful window-related operation. Time in milliseconds to pause (default=250).

    DE: Ändert, wie lange ein Skript nach einem erfolgreichen Fenstervorgang kurz anhalten soll. Zeit in Millisekunden bis zum Anhalten (Standard = 250).

    Nach dem Setzen einer Option, ist sie solange gültig, bis sie an anderer Stelle wieder geändert wird. Es gibt aber auch Optionen, bei denen eine nachträgliche Änderung wenig bis keinen Sinn macht, so z. B. Opt('MustDeclareVars', 1). Einige Optionen, wie z.B. Opt("WinTitleMatchMode", 1) werden oftmals innerhalb von Funktionen geändert und vor Verlassen der Funktion wieder auf den vorherigen Wert gesetzt.

  • Regex "Multipattern" möglich?

    • Bitnugger
    • 6. April 2019 um 22:35
    Zitat von Lottich

    Nachtrag: hoffentlich merke ich mir das auch. So oft brauch ich RegEx nicht...

    Für solche Fälle habe ich mir spezielle Ordner angelegt...

    Code
    M:\>dir /B f:\_Archive\_Programmieren\AutoIt3\User\Bitnugger\RegEx\
    _RegEx_ExtractFirstThreeIntNumbersFromLines.au3
    ...
  • Anwendungen automatisch an bestimmte Monitorposition mit definierter Größe öffnen

    • Bitnugger
    • 2. April 2019 um 21:30

    Oder so...

    Code
    Func _KILL()
        Local $aProcessList = ProcessList("CSBridge.exe")
        If @error Then Return False
        For $i = 1 To $aProcessList[0][0] Step 1
            ProcessClose($aProcessList[$i][1])
        Next
        Return True
    EndFunc
  • AutoIt Window Info erkennt Farben nicht

    • Bitnugger
    • 1. April 2019 um 15:26
    Zitat von gmmg

    mit dem Autoit Window Info kann man auch den Farbwert anzeigen.

    Heiliger Zitronenfalter... tzzz... 3x alle Tabs im Info Tool überflogen und immer noch übersehen! Ok, dann sind halt nur die angegebenen Werte auf der Webseite falsch. Danke für den Hinweis!

  • AutoIt Window Info erkennt Farben nicht

    • Bitnugger
    • 1. April 2019 um 02:42
    Zitat von euronymous

    wenn ich das Tool Window Info (x86) oder (x64) benutze um die Farbe zu erkennen, zeigt er mir eine völlig falsche Farbe an.

    Du meinst "AutoIt Window Info" (Au3Info.exe) ? Das liefert dir ganz sicher keine Farbwerte... dafür benötigst du einen "ColorPicker"... z.B. ColorMania.

    PS: Auf der Webseite sind viele Farbwerte tatsächlich auch falsch angegeben...

  • Diskussion zum Thema : "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Bitnugger
    • 1. April 2019 um 02:17
    Zitat von Musashi

    Ist daher nicht eher GuiSetState(@SW_MINIMIZE) die eigentliche 'Fehlerquelle', und nicht WinGetPos wie im Sammelthread derzeit angegeben ?

    Natürlich ist GuiSetState(@SW_MINIMIZE) die Fehlerquelle, was zudem auch durch den Rückgabewert 0 bestätigt wird. Im Sammelthread habe ich mit meinem Satz aber an keiner Stelle eine Schuldzuweisung ausgesprochen... allerdings könnte man den Satz noch mit einem weil... erweitern.

  • Diskussion zum Thema : "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Bitnugger
    • 31. März 2019 um 20:22
    Zitat von Musashi

    Erst ein vorheriges GUISetState() ohne Parameter (verwendet als Default dann ja @SW_SHOW) löst das Problem.

    Einmal GUISetState reicht, dann allerdings mit: GUISetState(@SW_SHOWMINIMIZED)

  • Diskussion zum Thema : "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Bitnugger
    • 31. März 2019 um 19:52

    Tuxedo

    Wird anstelle GUISetState WinSetState verwendet, um das "quasi nicht existierende" Fenster zu minimieren, funktioniert es... erkläre das mal bitte!

    Code
    _Example_BAD()
    
    Func _Example_BAD()
        ConsoleWrite($g_sSpacer)
        Local $hGUI = GUICreate(''), $iState
        _PrintPos('! _Example_BAD() : $aPos after GUICreate("")                       ', $hGUI)
        $iState = GUISetState(@SW_MINIMIZE)
        ConsoleWrite("- _Example_BAD() : GUISetState(@SW_MINIMIZE)                        = " & $iState & @CRLF)
        _PrintPos('! _Example_BAD() : $aPos after GUISetState(@SW_MINIMIZE)           ', $hGUI)
        $iState = WinSetState($hGUI, '', @SW_MINIMIZE)
        ConsoleWrite("+ _Example_BAD() : WinSetState($hGUI, '', @SW_MINIMIZE)             = " & $iState & @CRLF)
        _PrintPos('! _Example_BAD() : $aPos after WinSetState($hGUI, "", @SW_MINIMIZE)', $hGUI)
        ConsoleWrite($g_sSpacer)
        GUIDelete()
    EndFunc
    
    Func _PrintPos($sText, $hWnd)
        Local $aPos = WinGetPos($hWnd)
        ConsoleWrite(StringFormat('%-59s =    X: %6i,   Y: %6i,     W: %6i,      H: %6i\n', $sText, $aPos[0], $aPos[1], $aPos[2], $aPos[3]))
    EndFunc
    Alles anzeigen

  • Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Bitnugger
    • 31. März 2019 um 12:17

    WinGetPos liefert nicht wie erwartet die Position und Größe des minimierten Fensters, wenn nach GUICreate('') nur ein GUISetState(@SW_MINIMIZE) ausgeführt wird, sondern die Position und Größe, welche beim Erstellen des Fenster verwendet wurde - also entweder die angegeben Werte oder die Default-Werte.

    Edit: Inspiriert durch @Musashi habe ich mich entschlossen, die Examples etwas zu erweitern, damit man der Ausgabe auch gleich entnehmen kann, wo hier der Schuh drückt.

    PS: Beim Erstellen einer GUI interpretiert GUICreate die Höhe und Breite als ClientSize, WinGetPos liefert jedoch die Position und Größe inkl. Rahmen!

    Code
    Global $g_sSpacer = '--------------------------------------------------------------------------------------------------------------------------------------' & @CRLF
    
    ConsoleWrite($g_sSpacer)
    _Example_BAD() ; --> GUISetState(@SW_MINIMIZE)
    _Example_OK1() ; --> GUISetState(@SW_SHOWMINIMIZED)
    _Example_OK2() ; --> WinSetState($hGUI, '', @SW_MINIMIZE)
    
    Func _Example_BAD() ; GUISetState(@SW_MINIMIZE)
        Local $hGUI = GUICreate(''), $iState
        _PrintPos("> _Example_BAD() : $aPos after GUICreate('')", $hGUI)
        $iState = GUISetState(@SW_MINIMIZE) ; $iState = 0 - die GUI konnte nicht minimiert werden!
        ConsoleWrite("! _Example_BAD() : $iState = GUISetState(@SW_MINIMIZE)              $iState = " & $iState & @CRLF)
        _PrintPos('> _Example_BAD() : $aPos after GUISetState(@SW_MINIMIZE)', $hGUI, True)
        GUIDelete()
    EndFunc
    
    Func _Example_OK1() ; GUISetState(@SW_SHOWMINIMIZED)
        Local $hGUI = GUICreate(''), $iState
        _PrintPos("> _Example_OK1() : $aPos after GUICreate('')", $hGUI)
        $iState = GUISetState(@SW_SHOWMINIMIZED) ; $iState = 1 - die GUI konnte minimiert werden!
        ConsoleWrite("+ _Example_OK1() : $iState = GUISetState(@SW_SHOWMINIMIZED)         $iState = " & $iState & @CRLF)
        _PrintPos('> _Example_OK1() : $aPos after GUISetState(@SW_SHOWMINIMIZED)           ', $hGUI, True)
        GUIDelete()
    EndFunc
    
    Func _Example_OK2() ; WinSetState($hGUI, '', @SW_MINIMIZE)
        Local $hGUI = GUICreate(''), $iState
        _PrintPos("> _Example_OK2() : $aPos after GUICreate('')", $hGUI)
        $iState = WinSetState($hGUI, '', @SW_MINIMIZE)
        ConsoleWrite("+ _Example_OK2() : $iState = WinSetState($hGUI, '', @SW_MINIMIZE)   $iState = " & $iState & @CRLF)
        _PrintPos("> _Example_OK2() : $aPos after WinSetState($hGUI, '', @SW_MINIMIZE)", $hGUI, True)
        GUIDelete()
    EndFunc
    
    Func _PrintPos($sText, $hWnd, $bSpacer = False)
        Local $aPos = WinGetPos($hWnd)
        ConsoleWrite(StringFormat('%-75s =    X: %6i,   Y: %6i,     W: %6i,      H: %6i\n%s', $sText, $aPos[0], $aPos[1], $aPos[2], $aPos[3], $bSpacer ? $g_sSpacer : ''))
    EndFunc
    Alles anzeigen

    WinGetPos_Error_3.png

    Fazit: GUISetState(@SW_MINIMIZE) funktioniert nur, wenn das Fenster vorher bereits sichtbar gemacht wurde... wohingegen WinSetState($hGUI, '', @SW_MINIMIZE) aber auch funktioniert, wenn es noch nicht sichtbar ist. Sicherheitshalber sollte aber generell besser @SW_SHOWMINIMIZED als Parameter angeben werden, wenn unklar ist, ob das Fenster bereits sichtbar ist.

  • Bild filtern/ strukturiert absuchen

    • Bitnugger
    • 30. März 2019 um 23:16
    Zitat von DDiSoEsT

    Gibt es einen Weg, dass sich dass Programm die $url, hinter der sich die Grafik von den Sitzplätzen des Blockes verbergen automatisch zieht?

    Ja, mehrere... mit InetGet kannst du es als Datei speichern, mit InetRead ($INET_BINARYTRANSFER) bekommst du ein Binary-String, mit dem du dann eine Bitmap erstellen kannst. Hier ein Bsp. mit InetRead:

    C
    #include <InetConstants.au3>
    #include <GDIPlus.au3>
    
    Example()
    
    Func Example()
        _GDIPlus_Startup()
    
        Local $hBitmap, $sURL, $dImage, $sFile
    
        ; URL anpassen!!!
        $sURL = 'http://MyServer.com:8090/Pics/Block7.png' ; 8090 ist die Portnummer. Default (muss nicht angegeben werden!): http = 80, https = 443
        $dImage = InetRead($sURL, BitOR($INET_FORCERELOAD, $INET_BINARYTRANSFER))
    ;~  $dImage = InetRead($sURL, BitOR($INET_FORCERELOAD, $INET_IGNORESSL, $INET_BINARYTRANSFER)) ; Bei https, wenn das Zertifikat nicht ok ist.
    
        If IsBinary($dImage) Then $hBitmap = _GDIPlus_BitmapCreateFromMemory($dImage)
        If @error Then
            MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "#Error: " & @error, IsBinary($dImage) ? "This file isn't supported by GDIPlus!" : 'Probleme bei InetRead!')
            Exit
        Else
            $dImage = ''
            $sFile = StringRegExpReplace($sURL, '.+/(.+)', '\1')
            $aDim = _GDIPlus_ImageGetDimension($hBitmap)
            If @error Then
                MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "#Error: " & @error, "Probleme bei _GDIPlus_ImageGetDimension!"
            Else
                ConsoleWrite("- Image dimension of " & $sFile & ": Width = " & $aDim[0] & " pixel " & " Height = " & $aDim[1] & " pixel" & @CRLF & @CRLF)
            EndIf
        EndIf
        
        ; cleanup GDI+ resources
         _GDIPlus_BitmapDispose($hBitmap)
        
        _GDIPlus_Shutdown()
    EndFunc  ;==>Example
    Alles anzeigen
  • Frage zur Benennung von *.api und *.properties Dateien

    • Bitnugger
    • 30. März 2019 um 16:34
    Zitat von ISI360

    Gibt es für die Benennung dieser Dateien seitens AutoIt hier irgentwelchen Standards?

    Wenn es dafür Standards gibt, dann musst du bei SciTE bzw. SciTE4AutoIt3 danach suchen und nicht bei AutoIt. Was Standard ist, weißt du aber doch bereits: Alles in eine Datei!

    Demzufolge kannst du die Dateien nach Lust und Laune benennen.

    Damit sie von SciTE beachtet werden, könnten die UDFs in einem jeweils eigenen Verzeichnis ablegen werden, in dem diese Dateien enthalten sind. Darin kann dann eine SciTEDirectory.properties erstellen werden, in der diese Dateien included werden. Die Auswertung der Verzeichnisseigenschaftendatei ist in SciTE standardmäßig deaktiviert und muss erst aktiviert werden, indem die Variable properties.directory.enable in der Benutzer- oder globalen Eigenschaftendatei auf 1 gesetzt wird. So in etwa kannst du das analog für deine IDE umsetzen.

    Ich denke aber, dass diese Vorgehensweise zusätzliche Nachteile mit sich bringt, welche die Vorteile bei weitem überwiegen.

  • Bild filtern/ strukturiert absuchen

    • Bitnugger
    • 30. März 2019 um 05:25
    Zitat von alpines

    Mit 0x0FF04CEFC als Farbcode (2, 206, 252 wie du es angegeben hast) klappt es.

    0x0FF04CEFC ?

    Hier mal eine kleine Starthilfe... damit bekommst du allerdings nur die Koordinaten angezeigt, an denen sich zwei freie Plätze nebeneinander befinden, nicht aber die Reihen und Spalten. Das musst du selbst erledigen... die Vorgehensweise ist ähnlich wie beim Auffinden der freien Plätze.

    C
    Opt('MustDeclareVars', 1)
    
    #include <MsgBoxConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <GDIPlus.au3>
    
    Example1() ; mit Schnickschnack
    Example2() ; ohne Schnickschnack
    
    Func Example1()
        ConsoleWrite(@CRLF & '> ------------------------------------------------------------------------------' & @CRLF)
        ConsoleWrite('> Example1()' & @CRLF)
        ConsoleWrite('> ------------------------------------------------------------------------------' & @CRLF & @CRLF)
        Local $aCoords[0][2], $aDim, $hBitmap, $aColor[3], $sFile = @ScriptDir & "\Block7.png"
    
        _GDIPlus_Startup()
    
        $hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
        If @error Or Not $hBitmap Then
            MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "Error", "This file isn't supported by GDIPlus!")
            Exit
        Else
            $aDim = _GDIPlus_ImageGetDimension($hBitmap)
            ConsoleWrite("- Image dimension of " & $sFile & ": Width = " & $aDim[0] & " pixel " & " Height = " & $aDim[1] & " pixel" & @CRLF & @CRLF)
        EndIf
    
        Local $hGUI = GUICreate("GDI+ Example (" & @ScriptName & ")", $aDim[0], $aDim[1]) ;create a test GUI
        GUISetState(@SW_SHOW)
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;create a graphics object from a window handle
        _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ;copy bitmap to graphics object (GUI)
        _GDIPlus_GraphicsDispose($hGraphics)
    
        ; Block7.png
        ;  9/13 = 0xFF04CEFC (blau)
        ;  9/12 = 0xFF04CEFC (blau)
        ; 28/1  = 0xFF046AFC (blau) - auch blau, aber nicht derselbe Farbwert wie bei 13/12!!!
        ; Linke obere Ecken der freien Plätze ermitteln
        For $iY = 0 To $aDim[1] - 2
            For $iX = 0 To $aDim[0] - 2
                $aColor[0] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY), 8)
                If $aColor[0] = '0xFF04CEFC' Or $aColor[0] = '0xFF046AFC' Then
                    $aColor[1] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX + 1, $iY), 8)
                    $aColor[2] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY +1), 8)
                    If ($aColor[1] = '0xFF04CEFC' And $aColor[2] = '0xFF04CEFC') Or ($aColor[1] = '0xFF046AFC' And $aColor[2] = '0xFF046AFC') Then
                        ConsoleWrite(StringFormat('> Match: $aColor[0] = %s $aColor[1] = %s $aColor[2] = %s\n', $aColor[0], $aColor[1], $aColor[2]))
                        _GDIPlus_BitmapSetPixel($hBitmap, $iX, $iY, BitXOR(0x00FFFFFF, $aColor[0])) ;invert RGB pixel color only
                        _ArrayAdd($aCoords, $iX & '|' & $iY)
                    EndIf
                EndIf
            Next
        Next
        ConsoleWrite(@CRLF & '> $aCoords: ' & _ArrayToString($aCoords, ', ', -1, -1, '|') & @CRLF)
    
        Local $iColor, $iSpace, $iBkColor = '0xFFFCFEFC'
        For $iX = $aCoords[0][0] To $aDim[0] -1
            $iColor = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $aCoords[0][1]), 8)
            If $iColor <> $iBkColor Then ContinueLoop
    
            For $iX = $iX To $aDim[0] -1
                $iColor = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $aCoords[0][1]), 8)
                If $iColor = $iBkColor Then
                    $iSpace += 1
                Else
                    ExitLoop 2
                EndIf
            Next
        Next
        ConsoleWrite('! $iSpace = ' & $iSpace & @CRLF)
    
    ;~     _ArrayDisplay($aCoords, '$aCoords')
        Local $iBlockSize = 11, $aAll = _ArrayFindAll($aCoords, $aCoords[0][1], 0, 0, 0, 0, 1)
    ;~     _ArrayDisplay($aAll, '$aAll')
        While UBound($aAll) > 1
            For $i = 0 To UBound($aAll) -2 Step 1
                If $aCoords[$aAll[$i]][0] + $iBlockSize + $iSpace = $aCoords[$aAll[$i +1]][0] Then
                    ConsoleWrite('+ Zwei Plätze nebeneinander sind frei!' & @CRLF & _
                        '--> $aCoords Platz 1: ' & $aCoords[$aAll[$i]][0] & ', ' & $aCoords[$aAll[$i]][1] & '  $aCoords Platz 2: ' & $aCoords[$aAll[$i +1]][0] & ', ' & $aCoords[$aAll[$i +1]][1] & @CRLF)
                    Local $iMouseCoordMode = Opt('MouseCoordMode', 2)
                    MouseMove($aCoords[$aAll[$i]][0], $aCoords[$aAll[$i]][1], 30)
                    ToolTip('1. freier Platz')
                    Sleep(1000)
                    MouseMove($aCoords[$aAll[$i +1]][0], $aCoords[$aAll[$i +1]][1], 30)
                    ToolTip('2. freier Platz')
                    Sleep(1000)
                    ToolTip('')
                    Opt('MouseCoordMode', $iMouseCoordMode)
                EndIf
            Next
            $aAll = _ArrayFindAll($aCoords, $aCoords[$aAll[UBound($aAll) -1] + 1][1], $aAll[UBound($aAll) -1] + 1, 0, 0, 0, 1)
        WEnd
        ConsoleWrite('! Done!' & @CRLF)
    
        $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;create a graphics object from a window handle
        _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ;copy negative bitmap to graphics object (GUI)
    
    ;~     Do
    ;~     Until GUIGetMsg() = $GUI_EVENT_CLOSE
        Sleep(1000)
    
        ; cleanup GDI+ resources
         _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_Shutdown()
        GUIDelete($hGUI)
    EndFunc  ;==>Example1
    
    Func Example2()
        ConsoleWrite(@CRLF & '> ------------------------------------------------------------------------------' & @CRLF)
        ConsoleWrite('> Example2()' & @CRLF)
        ConsoleWrite('> ------------------------------------------------------------------------------' & @CRLF & @CRLF)
        Local $aCoords[0][2], $aDim, $hBitmap, $aColor[3], $sFile = @ScriptDir & "\Block7.png"
    
        _GDIPlus_Startup()
    
        $hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
        If @error Or Not $hBitmap Then
            MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "Error", "This file isn't supported by GDIPlus!")
            Exit
        Else
            $aDim = _GDIPlus_ImageGetDimension($hBitmap)
            ConsoleWrite("- Image dimension of " & $sFile & ": Width = " & $aDim[0] & " pixel " & " Height = " & $aDim[1] & " pixel" & @CRLF & @CRLF)
        EndIf
    
        ; Block7.png
        ;  9/13 = 0xFF04CEFC (blau)
        ;  9/12 = 0xFF04CEFC (blau)
        ; 28/1  = 0xFF046AFC (blau) - auch blau, aber nicht derselbe Farbwert wie bei 13/12!!!
        ; Linke obere Ecken der freien Plätze ermitteln
        For $iY = 0 To $aDim[1] - 2
            For $iX = 0 To $aDim[0] - 2
                $aColor[0] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY), 8)
                If $aColor[0] = '0xFF04CEFC' Or $aColor[0] = '0xFF046AFC' Then
                    $aColor[1] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX + 1, $iY), 8)
                    $aColor[2] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY +1), 8)
                    If ($aColor[1] = '0xFF04CEFC' And $aColor[2] = '0xFF04CEFC') Or ($aColor[1] = '0xFF046AFC' And $aColor[2] = '0xFF046AFC') Then
                        ConsoleWrite(StringFormat('> Match: $aColor[0] = %s $aColor[1] = %s $aColor[2] = %s\n', $aColor[0], $aColor[1], $aColor[2]))
                        _ArrayAdd($aCoords, $iX & '|' & $iY)
                    EndIf
                EndIf
            Next
        Next
        ConsoleWrite(@CRLF & '> $aCoords: ' & _ArrayToString($aCoords, ', ', -1, -1, '|') & @CRLF)
    
        Local $iColor, $iSpace, $iBkColor = '0xFFFCFEFC'
        For $iX = $aCoords[0][0] To $aDim[0] -1
            $iColor = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $aCoords[0][1]), 8)
            If $iColor <> $iBkColor Then ContinueLoop
    
            For $iX = $iX To $aDim[0] -1
                $iColor = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $aCoords[0][1]), 8)
                If $iColor = $iBkColor Then
                    $iSpace += 1
                Else
                    ExitLoop 2
                EndIf
            Next
        Next
        ConsoleWrite('! $iSpace = ' & $iSpace & @CRLF)
    
    ;~     _ArrayDisplay($aCoords, '$aCoords')
        Local $iBlockSize = 11, $aAll = _ArrayFindAll($aCoords, $aCoords[0][1], 0, 0, 0, 0, 1)
    ;~     _ArrayDisplay($aAll, '$aAll')
        While UBound($aAll) > 1
            For $i = 0 To UBound($aAll) -2 Step 1
                If $aCoords[$aAll[$i]][0] + $iBlockSize + $iSpace = $aCoords[$aAll[$i +1]][0] Then
                    ConsoleWrite('+ Zwei Plätze nebeneinander sind frei!' & @CRLF & _
                        '--> $aCoords Platz 1: ' & $aCoords[$aAll[$i]][0] & ', ' & $aCoords[$aAll[$i]][1] & '  $aCoords Platz 2: ' & $aCoords[$aAll[$i +1]][0] & ', ' & $aCoords[$aAll[$i +1]][1] & @CRLF)
                EndIf
            Next
            $aAll = _ArrayFindAll($aCoords, $aCoords[$aAll[UBound($aAll) -1] + 1][1], $aAll[UBound($aAll) -1] + 1, 0, 0, 0, 1)
        WEnd
        ConsoleWrite('! Done!' & @CRLF)
    
        ; cleanup GDI+ resources
         _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_Shutdown()
    EndFunc  ;==>Example2
    Alles anzeigen

    Block7.png

  • Anwendungen automatisch an bestimmte Monitorposition mit definierter Größe öffnen

    • Bitnugger
    • 29. März 2019 um 16:39
    Zitat von Code4Fun

    Wird hier entweder auf das erscheinen des Titles UND / ODER auf die Klasse gewartet?

    Das lässt sich leicht testen... indem du einmal einen falschen Titel und einmal eine falsche Klasse angibst...

    ConsoleWrite(WinGetHandle('[TITLE:M:\Test.au3; CLASS:SciTEWindow]') & @CRLF)

    ConsoleWrite(WinGetHandle('[TITLE:Z:\Test.au3; CLASS:SciTEWindow]') & @CRLF)

    ConsoleWrite(WinGetHandle('[TITLE:M:\Test.au3; CLASS:XWindow]') & @CRLF)

    Ausgabe:

    0x00041070

    0x00000000

    0x00000000

    Fazit: Alle angegebenen Kriterien müssen zutreffen.

    In der AutoIt-Hilfe findest du dazu Infos unter Using AutoIt --> Window Titles and Text (Advanced)

    Auszug:

    One or more properties are used in the title parameter of a window command in the format:

    [PROPERTY1:Value1; PROPERTY2:Value2]

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™