Beiträge von Bitnugger

    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.

    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...


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

    _GUICtrlListView_SimpleSort()


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


    So würde ich es übersetzen:

    Zu [CLASS:#32770]

    https://docs.microsoft.com/de-…nmsg/about-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
    1. 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
    2. If Not IsHWnd($hWnd) Then Exit 1
    3. ConsoleWrite("$hWnd --> " & $hWnd & @CRLF)
    4. Local $idCtrl = 1000, $sText = "", $hCtrl = ControlGetHandle($hWnd, $sText, $idCtrl) ; oder einfach ControlGetHandle($hWnd, "", 1000)
    5. If Not IsHWnd($hCtrl) Then Exit 2
    6. ConsoleWrite("$hCtrl --> " & $hCtrl & @CRLF)
    7. ; ...


    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.

    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.

    Tuxedo

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

    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!


    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.

    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:

    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.

    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.

    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]


    dein Script fliegt hier raus If Not IsHWnd($hWnd) Then _ErrExit(4, 'Fehler bei WinWaitActive!') ; Fehlermeldung wird erzeugt, somit kann ich die beiden Handles noch nicht vergleichen.

    In dem Fall gibt es keine zwei Handles weil keines gefunden wurde... und somit auch nichts zu vergleichen. Eine Ausgabe von $hWnd mit ConsoleWrite bringt dann auch nicht mehr Erleuchtung.


    Ich sehe aber, das ich wieder mal einen blöden Fehler eingebaut habe... ändere folgende Zeile um...

    $hWnd = WinWaitActive("[TITLE:IBM Notes Arbeitsbereich: CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde

    zu...

    $hWnd = WinWaitActive("[TITLE:IBM Notes Arbeitsbereich; CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde

    oder so, wenn das auch nicht geht...

    $hWnd = WinWaitActive("[REGEXPTITLE:^(IBM Notes.+); CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde


    Du kennst ja sicherlich die Windows Tastenkombinationen "WinTaste" + Pfeiltasten

    Ja ok, das macht allerdings Sinn.

    OMG den Tipp hätte ich nicht in einem Thread gegeben, der mit Keylogger überschrieben ist..

    Ich vertraue auf das Gute im Menschen und habe zudem auch keine fertige Lösung präsentiert... lediglich einen Hinweis, dass in der AutoIt-Hilfe weitere Infos dazu stehen... die allerdings nur dann verständlich sind, wenn eine gewisse Erkenntnisstufe vorhanden ist. Wer sich mit Hilfe Anderer einen funktionierenden Keylogger erschleichen will und damit nichts Gutes im Sinn hat, lebt eh auf extrem dünnem Eis...