Auf eine bestimmte Stelle klicken, wenn ein bestimmtes Fenster erscheint

  • Anlehnend an meinen anderen Thread: Programm schreiben, das überprüfen soll ob .exe im Hintergrund läuft (vielen Dank an dieser Stelle für die zahlreichen Antworten!) möchte ich auf eine bestimmte Stelle klicken, wenn ein bestimmtes Fenster erscheint.

    Allerdings soll das in einer while-Schleife passieren. Meine will nicht so ganz klappen:

    Also, das erste Problem hierbei ist, dass das erste if-Statement nur einmal ausgeführt wird. Kann mir vorstellen, dass es daran liegt, dass er beim zweiten hängenbleibt.

    Das zweite Problem ist, dass ich beim MousClick nicht per Koordinaten klicken möchte, da diese sich immer wieder verändern können.

    Ich glaube, die Lösung ist es, per Klassen zu arbeiten. Allerdings weiß ich nicht, ob ich die Klasse von "Basic Window Info" oder von "Basic Control Info" nehmen muss.

    Wenn ich bestimmte klickbare Teile innerhalb des Fensters auswähle, dann ändert sich eine Klasse, die andere bleibt gleich. Heißt, es müsste die änderbare, also Basic Control Info sein, denke ich mal: basic_button#9

    Was habe ich also falsch gemacht?

    Einmal editiert, zuletzt von SOLVE-SMART (13. März 2023 um 21:26)

  • Hi @f705185@rppkn.com,

    zu aller erst möchte ich dir den Hinweis geben, dass du unter "Benutzerkonto verwalten" deinen Benutzernamen ändern kannst.

    Nur für den Fall das er dir zu lang erscheint 😅 .

    Dann zu deiner Fragestellung:

    • Du möchtest wenn der Prozess AnyDesk noch nicht läuft, dass dieser geöffnet wird und im aufpoppenden Fenster etwas geklickt wird. Soweit erstmal korrekt, richtig?
    • Wenn der Prozess AnyDesk bereits existiert, zum Zeitpunkt des ersten Ausführens, dann soll dies auch geschehen oder nicht?
    • Was soll passieren wenn die Klicks ausgeführt wurden? Dies ist u. a. entscheidend für die Logik in der Schleife.

    💡 Bestenfalls kannst du mit ControlClick() und/oder ControlCommand() arbeiten. Denn dann musst du nicht über Koordinaten gehen. Schaue dir die Hilfe zu diesen Funktionen einfach mal an. Falls das Fenster jedoch nicht mit diesen Funktionen erreichbar sein sollte, hast du mindestens zwei Optionen.

    A: Du setzt dich mit UIAutomation auseinander (was eine gewisse Einarbeitungsphase und ggf. fortgeschrittene Kenntnisse voraussetzt).

    B: Du nutzt doch Koordination, die jedoch relativ zum aktiven Fenster sind, nicht zum Screen. D. h. Wenn du das Fenster schiebst auf deinem Monitor bspw., sind die relativen Koordination im Fenster noch immer die Gleichen. Falls das Fenster nicht irgendwie größer oder kleiner gezogen wurde. Dies kannst du allerdings mit der Funktion WinMove() ganz gut handhaben. Denn du setzt einfach das aktive (bei dir AnyDesk) Fenster auf eine von dir definierte Größe und machst danach deine Klicks.

    AutoIt
    Opt('MouseCoordMode', 0) ; 0 = relative Koordinaten zum aktiven Fenster

    Viele Grüße
    Sven

  • Abend Sven,

    genau, wenn Anydesk noch nicht läuft, dann soll es laufen.

    Und wenn da eine Verbindungsfrage kommt, soll er es annehmen.

    Das alles in einer unendlichen While Schleife, damit das auch immer klappt.

    Den Rest schaue ich mir morgen früh mal genauer an. Danke schonmal!

  • Hier mal die einfachere Variante mit den Maus-Klicks. Nicht elegant und je nachdem was du alles machen willst auch nicht ausreichend, aber vielleicht reicht dir das bereits.

    💡 Wichtig hierbei:

    Es wird nur reagiert, wenn der Prozess nicht existiert. Also bspw. der Rechner startet neu, dann wird AnyDesk gestartet und auf X oder Y geklickt (dies musst du vorgeben wo).

    Oder: Jemand beendet AnyDesk komplett (der Prozess existiert nicht mehr), dann wird dieser erneut gestartet, die Klicks werden gemacht etc.

    💡 Aber:

    Wenn der Prozess bereits vorhanden ist oder noch läuft und dann erst das Skript gestartet wird, wird auch nichts geklickt. Also wenn ein Nutzer einfach die Verbindung beendet, anstatt den AnyDesk wirklich komplett zu schließen, dann merkt dies das Skript nicht (es reagiert nicht), da nur darauf gelauscht wird, ob der Prozess läuft oder nicht.

    Wenn dies so nicht reicht, dann müsstest du einen anderen Indikator dafür finden, ob eine Verbindung bereits besteht oder nicht. Falls nicht, Fenster in den Vordergrund bringen und Klick-Aktionen machen (dieser Teil ist ja bereits vorhanden).

    Bin gespannt, was du meinst 😅 .

    Viele Grüße
    Sven

  • Vielen lieben Dank für deine sehr ausführliche Antwort!!

    Aber ich denke, du hast mich da leider falsch verstanden.

    Und zwar soll Anydesk immer im Hintergrund laufen, und wenn es nicht läuft bzw. geschlossen wird, dann soll es laufen.

    Das geschieht ja soweit gut mit folgendem Code:

    AutoIt
        If Not ProcessExists('AnyDesk.exe') Then
            Run('C:\Program Files (x86)\AnyDesk\AnyDesk.exe')
        EndIf
    
        Sleep(250)

    Dann ist es ja so, dass ein zusätzliches Fenster erscheint, wenn eine Verbindungsanfrage von einem Gerät kommt.

    Da möchte ich es so haben, dass im zusätzlichen Pop-up auf annehmen gedrückt wird.

    Und genau da ist mein Problem:

    Ich weiß 1) nicht, ob ich die Klasse von "Basic Window Info" oder von "Basic Control Info" nehmen muss.

    2) Wie ich das am besten per ControlClick implentieren soll.

    Ich glaube, dein Code ist da wirklich sehr ausführlich, ich glaube sogar fast schon zu sehr ausführlich.

    Das geht bestimmt kürzer, mir fehlt da sogar (mit dem ersten Code im Anfangspost verglichen) glaube ich nur eine Zeile, die korrigiert werden muss.

  • Ich glaube, dein Code ist da wirklich sehr ausführlich, ich glaube sogar fast schon zu sehr ausführlich.

    Der Code ist deswegen "ausführlich", so wie du es beschreibst, da er weitestgehend robust sein soll.

    Das geht bestimmt kürzer, mir fehlt da sogar (mit dem ersten Code im Anfangspost verglichen) glaube ich nur eine Zeile, die korrigiert werden muss.

    Für dein beschriebenes Szenario reicht es aus meiner Sicht nicht, nur eine Zeile zu korrigieren.

    💡 Um dir besser helfen zu können ist aus zumindest aus meiner Sicht nötig, den Ablauf besser zu verstehen. Kannst du daher mal ein paar Screenshots machen in denen du deutlich machst, was du manuell genau tun würdest? Dann sind die Vorschläge sicherlich auch besser.

    Viele Grüße
    Sven

  • Kannst du daher mal ein paar Screenshots machen in denen du deutlich machst, was du manuell genau tun würdest? Dann sind die Vorschläge sicherlich auch besser.

    Sehr gerne.

    Also, das normale Anydesk Fenster läuft ja, und wenn es nicht läuft, dann wird es gestartet. Das klappt alles, da muss auch am Code nichts verändert werden.

    So, nun ist es so, dass, wenn sich ein anderes Gerät verbinden möchte, dann ein neues Fenster erscheint. Dafür soll es in der gleichen while Schleife auch eine Bedingung geben, dass diese Anfrage jederzeit angenommen wird (sei es um 3 oder um 19 Uhr).

    Im Anhang ist ein Bild, wie diese Anfrage aussieht.

    Kurz: es soll einfach nur auf annehmen drücken, sobald eine Verbindungsanfrage erscheint.

    Und könntest du mir bitte endlich mal den Unterschied zwischen der Klasse von "Basic Window Info" und "Basic Control Info" sagen? Danke.

  • Und könntest du mir bitte endlich mal den Unterschied zwischen der Klasse von "Basic Window Info" und "Basic Control Info" sagen? Danke.

    Nein, woher auch? Wie wäre es wenn du beschreibst wo du diese Angaben her hast oder siehst? Geht es um das Au3Info Tool, welches dir diese Klassen anzeigt, wenn du über das aufpoppende AnyDesk Fenster hoverst? Vielleicht ich es dir nicht bekannt, doch ein Fenster kann auf Grund seines Aufbaus (bspw. der darunter liegenden Programmiersprache oder des verwendeten Frameworks (wie Swing, Qt etc.)) völlig unterschiedliche Controls/Elemente bzw. Klassen aufweisen. Also daher ist mir kein Basic Window Info oder Basic Control Info bekannt.

    Auch hierzu bitte Screenshots, damit man zumindest Versuche starten kann. Es ist nicht so, als würde ich mir extra AnyDesk installieren um dein Szenario durchzuspielen, ein wenig mehr Zuarbeit braucht es schon - schließlich bist du hier der Fragende, meinst du nicht?

    Bitte nicht falsch verstehen, doch Forderungen finde ich unangebracht.

    Viele Grüße
    Sven

  • Nein, woher auch? Wie wäre es wenn du beschreibst wo du diese Angaben her hast oder siehst? Geht es um das Au3Info Tool, welches dir diese Klassen anzeigt, wenn du über das aufpoppende AnyDesk Fenster hoverst? Vielleicht ich es dir nicht bekannt, doch ein Fenster kann auf Grund seines Aufbaus (bspw. der darunter liegenden Programmiersprache oder des verwendeten Frameworks (wie Swing, Qt etc.)) völlig unterschiedliche Controls/Elemente bzw. Klassen aufweisen. Also daher ist mir kein Basic Window Info oder Basic Control Info bekannt.

    Auch hierzu bitte Screenshots, damit man zumindest Versuche starten kann. Es ist nicht so, als würde ich mir extra AnyDesk installieren um dein Szenario durchzuspielen, ein wenig mehr Zuarbeit braucht es schon - schließlich bist du hier der Fragende, meinst du nicht?

    Bitte nicht falsch verstehen, doch Forderungen finde ich unangebracht.

    Viele Grüße
    Sven

    Ach nein, ich meinte das nicht bezogen auf meine Anwendung sondern i.A. also generell.

    Das Tool heiß Autoit Window Info. Dort gibt es eben diese 2 Kategorien

  • Achso! => Darum sagt ein Bild manchmal mehr als 1000 Worte 😅 .


    Basic Window Info zeigt den Titel des Fensters (siehe Titelleiste) und die CLASS des Parent-Elements des Fensters.
    Basic Control Info zeigt hingegen die Informationen des Controls, über das du mit dem "Finder Tool" hoverst. Allerdings auch nur, wenn Au3Info dies überhaupt erkennen kann.

    Viele Grüße
    Sven

  • Wenn du nun also mit dem Au3Info Tool über den grünen "Annehmen" button hoverst, wird dieser wahrscheinlich nicht als einzelnes Control angezeigt oder doch?
    Daher nochmal die Bitte: Screenshot des Tools während du über die Bereiche des AnyDesk Fensters hoverst bzw. über den Button.
    Danach sehen wir, ob die die CLASS verwenden kannst oder nicht.

    1. Alternative wenn nicht: Relative Koordinaten zum Klick benutzen (siehe mein Code-Beispiel weiter oben).
    2. Alternative wenn nicht: Mit PixelSearch() in einem gewissen Bereich des Fensters (auch wieder relativ zum Fensterinhalt, nicht zum Screen) nach dem grün des Buttons suchen und dort dann per Maus klicken lassen.

    Viele Grüße
    Sven

  • Ja, ok, dann wäre ja alles klar. Tut mir leid für die Verwirrung!

  • Natürlich. So sieht das dann aus, bin gespannt, wie das gelöst wird.

  • Falls das folgende nicht den Klick durchführt, dann wechsle im Au3Info Tool mal auf den Reiter Control und nutze ggf. die Advanced Mode (dort doppel-klicken und einfügen).

    ControlClick('AnyDesk', '', '[CLASS:basic_button#9]')

    Allerdings muss ich sagen, dass ich dir bereits im Beitrag #2 gesagt hatte, dass du die Hilfe mal bemühen solltest, denn aus dem Beispiel dort wäre genau dies auch hervorgegangen 🧐 .

    Viele Grüße
    Sven

  • Falls das folgende nicht den Klick durchführt, dann wechsle im Au3Info Tool mal auf den Reiter Control und nutze ggf. die Advanced Mode (dort doppel-klicken und einfügen).

    ControlClick('AnyDesk', '', '[CLASS:basic_button#9]')

    Allerdings muss ich sagen, dass ich dir bereits im Beitrag #2 gesagt hatte, dass du die Hilfe mal bemühen solltest, denn aus dem Beispiel dort wäre genau dies auch hervorgegangen 🧐 .

    Viele Grüße
    Sven

    Ich versuche es schon, so ist das nicht!

    Folgendes habe ich probiert, vielleicht kannst du ja direkt den Fehler erkennen:

    Ich habe jetzt bei allen die Klasse zu der vom Advaned gemacht.

    Einmal editiert, zuletzt von SOLVE-SMART (14. März 2023 um 14:56)

  • Folgendes habe ich probiert, vielleicht kannst du ja direkt den Fehler erkennen:

    Also du willst in der Schleife immer und immer wieder AnyDesk in den Vordergrund bringen und dann "Annehmen" klicken, egal ob das bereits passiert ist.
    Das wird so nicht funktionieren.

    💡 Im zweiten Parameter "text" welcher bei WinExists, WinActivate und WinWaitActivate optional ist, darf die Klasse nicht rein.

    Kannst du bitte mal diese Version an Code ausprobieren:

    Ich gehe hier davon aus, dass ein Fenster mit Titel "AnyDesk" aufpoppt und erst wenn dieses aufpoppt/aktiv/im Vordergrund ist, dann wird der Button "Annehmen" gewählt.

    Viele Grüße
    Sven

  • Also du willst in der Schleife immer und immer wieder AnyDesk in den Vordergrund bringen und dann "Annehmen" klicken, egal ob das bereits passiert ist.
    Das wird so nicht funktionieren.

    Kannst du bitte mal diese Version an Code ausprobieren:

    Ich gehe hier davon aus, dass ein Fenster mit Titel "AnyDesk" aufpoppt und erst wenn dieses aufpoppt/aktiv/im Vordergrund ist, dann wird der Button "Annehmen" gewählt.

    Viele Grüße
    Sven

    Ja, richtig. Man muss dieses neue Fenster sogar nicht mal aktiv in den Vordergrund bringen, es erscheint autom. "ganz nach vorne".

    Streng genommen muss man es sogar nicht irgendwohin verschieben, da es immer gleich groß und an der gleichen Stelle ist, wenn es erscheint.

    Obiger Code klappt leider auch nicht. Ich gebe es aber auf, das wird so nicht klappen. Wahrscheinlich irritiert den das, dass beide Fenster den gleichen Titel oder so haben.

    Ich bedanke mich nochmals sehr bei dir für deine Zeit & Mühen!

  • Wahrscheinlich irritiert den das, dass beide Fenster den gleichen Titel oder so haben.

    Warum sagst du das nicht gleich! Ja das ist sicherlich ein Grund, neben den anderen Hinweis den ich oben geschrieben hatte:

    Zitat

    💡 Im zweiten Parameter "text" welcher bei WinExists, WinActivate und WinWaitActivate optional ist, darf die Klasse nicht rein.

    Ich bedanke mich nochmals sehr bei dir für deine Zeit & Mühen!

    Alles klar, vielleicht hat noch jemand anders Zeit und Ambition dir hierbei zu helfen. Man kann auch bei gleichnamigen Titeln, dass "richtige" auswählen, aber ohne es bei mir testen zu können, macht dies für mich keinen Sinn. Daher bin ich raus.

    Alles Gute dir.

    Viele Grüße
    Sven

  • Wenn man davon ausgeht, dass man ein Script benötigt, um Arbeit zu erledigen, oder diese einfacher macht, dann verstehe ich nicht wozu du dieses Script haben willst.

    Fall 1 Any desk soll immer laufen? --> Ab in den Autostart.

    Fall 2 Any desk wird versehentlich wieder geschlossen - dann schreib einen 3 Zeiler der prüft ob Any desk läuft wenn nicht ---> starten. Wobei ich den Aufwand eine Software laufen zu lassen nur um zu prüfen ob eine andere Software läuft --- naja das kommt mir, in diesem Fall, schon ein wenig mit Kanonen auf Spatzen geschossen vor.

    Fall 3 Du willst Any desk "fernsteuern" hast Du schon bemerkt dass es Command Line Options für Any Desk gibt???

    Wozu soll das also mit der Maus sein?

    Mir kommt vor, dass versucht wird aus dem Kontext gerissenen Fragen beantworten zu lassen - ohne das Problem und den Lösungsansatz verständlich dargelegt zu haben. Oder einen vernünftigen Lösungsansatz mit uns zu erarbeiten.

    So long

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Moin zusammen,

    Peter S. Taler

    Nunja ich habe noch nie mit diesen Command Line Optionen von anydesk gearbeitet aber die lesen sich ja schon mal vielversprechend.


    Also den Prozess könnte er ja einfach überprüfen.

    Aber falls das mit dem unbeaufsichtigtem annehmen über die Command Line nicht gehen sollte, hab ich noch eine Idee noch ein Skript was ich mal mit der ImageSearch2015.au3 bearbeitet hatte.

    SOLVE-SMART

    echt cooler Ansatz schade das er für f705185 nicht funktioniert.


    @f705185@rppkn.com

    Da er anscheint nicht richtig tut was du möchtest kannst du so den Button mindestens problemlos erreichen, du müsstest natürlich die anybeispiel.png nochmal neu anpassen.

    Ich weiß nicht ob das beim hochladen so unscharf geworden ist oder liegt es einfach an der anzeige im Forum, deshalb

    Am besten mit Tastatur= [PRINT] Drücken öffne Paint auf einfügen drücken oder STRG-V dann markierst du den selben abschnitt wie im Beispiel Bild rechtsklick kopieren, dann alles markieren und [del]- taste drücken, nun den weißen Rand so klein wie möglich ziehen von unten nach oben und von rechts nach links, dann wieder einfügen dann musst du da nichts zuschneiden.

    anschließend als *png speichern.

    So nun zu meinem Beispiel: genutzt habe ich dafür die UDF ImageSearch2015.au3 beiliegende Dateien : |msvcr110d.dll|msvcr110.dll|ImageSearchDLLx32.dll|ImageSearchDLLx64.dll | testbildclick.au3 | anybeispiel.png


    Die anybeispiel.png (ich habe diese Datei mit deinen eingesendeten Bild aus Post, #7 gemacht, indem ich es groß geöffnet habe)

    Das ist nur ein Beispiel wie du durch Hilfe Bilder auch die Buttons erreichen kannst.

    Er überprüft ob er das Annehmen findet wenn ja dann wartet er 2 Sec, und fährt dann mit dem Mauszeiger in die Mitte und klickt in meinem Beispiel mit rechts, dann beendet er das Skript.

    die 1200000 ist der Timeout sollte er das Bild nicht finden dann könntest du den Wert ja verringern und es in einer schleife laufen lassen dann ist egal wie lange er bis Time Out sucht.^^

    Code
    _WaitForImageSearch('anybeispiel.png',1200000

    Wenn das mit dem Command Line nicht kappen sollte hast du nun eine Ausweichmöglichkeit.

    Mit der du dir jetzt deine Funktion zusammenbauen könntest.

    So das es immer wieder auf neue überprüft würd.

    Den Prozess kannst dann auch gleich mit überwachen lassen, ungefähr so.

    Code
    IF ProzessExits(anydesk.exe) = 0 Then 
    Run(...) 
    Sleep(5000)
    ElesiF ProzessExits(anydesk.exe) <> 0 Then 
    Return
    endif 


    viel Erfolg.

    Edit : ups : Mitte und klickt in meinem Beispiel mit rechts (im Forum zutreffend)| korrigiert : Mitte und klickt in meinem Beispiel mit links (im hochgeladenen Beispielzutreffend)