Möglich oder nicht? Zeitwert aus einem Programm im Hintergrund auslesen und in ein neues Script schreiben

  • Hallo zusammen

    Da bin ich mal wieder mit einer Frage: Ist es mit einem AutoIt-Script möglich aus einem Programmfenster, welches nicht den Focus am Bildschirm hat, einen Wert (Zeit Std./Min.) (siehe Bild) auszulesen und in ein neues Script zu schreiben?

    pasted-from-clipboard.png

    Hintergrund meiner Frage ist folgender. Ich benutze ein Modellbahnsteuerungsprogramm und ein Lichtsteuerungsprogramm eines direkten Wettbewerbers. Beide arbeiten natürlich nicht zusammen was die Zeitsynchronität betrifft. Dank eurer Hilfe bin ich wenigstens in der Lage jede gewünschte Zeit per UDP an das Lichtprogramm zu senden. Da ich aber keine volle 24h abbilden möchte verwende ich natürlich eine Zeitkompression. Und hier kommt das Problem. Wenn ich den neuen Zeitwert sende läuft das Lichtprogramm immer noch mit dem alten Zeitwert weiter, es sei denn es folgt eine neue Zeiteingabe. Das heisst ich muss die aktuelle Zeit, die angezeigt wird nochmal senden. Das Modellbahnprogramm kennt aber die aktuelle Zeit nicht. Ich habe mir jetzt eine Uhr aus mehrteiligen Schaltern im Mobaprogramm gebastelt die von einem Minutenimpuls des Lichtprogramms weitergeschaltet wird und ich so wenigstens die gleiche Zeit angezeigt bekomme. Im Moment begnüge ich mich beim Ändern des Zeitwerts damit, eine innerhalb der aktuellen halben Stunde liegende Zeit (halbe oder volle Stunde) zu senden. Dazu waren 48 Makros erforderlich. Ich möchte das aber gerne Minutengenau haben aber 23*59 Makros zu erstellen ist mir zu aufwendig.

    Falls das nicht so funktionieren wird gäbe es noch einen zweiten Lösungsansatz. Das Lichtprogramm sendet seine aktuelle Zeit per Netzwerk an ein ein anderes Programm dieses Entwicklers auf einem Raspi welches ich installiert habe um die aktuelle Zeit auf einem Ipad zu sehen wenn das Programm Im Hintergrund läuft. Ich bin aber zu dumm um damit etwas anfangen zu können. Vielleicht jemand von euch?

    Wenn ich 30 Jahre jünger wäre und es die begrenzte Freizeit zulassen würde, hätte ich mich genauer mit der Materie befasst aber ich entstamme einer Generation, welche ohne Handy und PC aufwachsen "musste":(

    Ich versuche ja schon immer mir wissen anzueignen aber bei fachspezifischen Begriffen und erst recht Englisch bin ich raus.

    Ich hoffe mein Beitrag war nicht zu viel Bla, Bla und es wäre schön, wenn sich vielleicht jemand zu meiner Fragestellung äussern könnte und mir beim Erstellen eines solchen Scripts, falls es machbar sein sollte, helfen könnte.

    Ich kann aber wieder nichts anderes anbieten als eine Spende für's Forum zu leisten.

    Trotzdem danke ich schonmal im Vorraus.

    Gruß Jörg

    • Offizieller Beitrag

    Ist es mit einem AutoIt-Script möglich aus einem Programmfenster, welches nicht den Focus am Bildschirm hat, einen Wert (Zeit Std./Min.) (siehe Bild) auszulesen und in ein neues Script zu schreiben?

    Das ist davon abhängig, ob das betreffende Programm mit Standard-Windows-Controls arbeitet oder mit anderen (z.B. in Delphi erstelltes grafisches Interface).

    Nutze dazu das AutoIt Window Info - Tool ( <Windows-Start Menü> <Programme> <AutoIt v3> <AutoIt Window Info> ).

    Ziehe das Finder Tool mit gedrückter Maustaste über das betreffende Control. Poste dann mal, was du im Reiter "Summary" angezeigt bekommst.

  • Hallo BugFix

    Folgende Infos werden ausgegeben:

    >>>> Fenster <<<<

    Titel: Light @ Night - 4.1a

    Klasse: TLichtwerkForm

    Position: -4, -4

    Größe: 1288, 992

    Stil: 0x17CF0000

    ExStyle: 0x00010110

    Handle: 0x0000000000040194

    >>>> Steuerung <<<<

    Klasse: TdxBarControl

    Instanz: 2

    KlassennameNN: TdxBarControl2

    Name:

    Fortgeschrittene (Klasse): [KLASSE: TdxBarControl; INSTANZ: 2]

    ID: 131676

    Text: Steuerung

    Position: 0, 26

    Größe: 210, 26

    ControlClick Coords: 83, 13

    Stil: 0x56000000

    ExStyle: 0x00000000

    Griff: 0x000000000002025C

    >>>> Maus <<<<

    Position: 83, 39

    Cursor-ID: 0

    Farbe: 0xF2F2F2

    >>>> Statusleiste <<<<

    >>>> ToolsBar <<<<

    >>>> Sichtbarer Text <<<<

    Hauptmenüs

    Steuerung

    Konfiguration


    >>>> Versteckter Text <<<<

    08:21

    1x


    Der versteckte Text sieht interessant aus, genau das ist die Uhrzeit(Modellzeit) und der aktuelle Zeitwert (1:1).

    Gruß Jörg

    Einmal editiert, zuletzt von mikush (25. September 2020 um 16:08)

    • Offizieller Beitrag

    Folgende Infos werden ausgegeben:

    WAS ist das denn für ein Info-Tool? Wer hat das denn so grauenhaft übersetzt? :Face:Es gibt Dinge, die darf man einfach nicht übersetzen, sonst wird (wie bei dir) aus dem Programmier-Handle ein "Griff" :rofl:

    Zum Thema. Leider keine Standard-Controls, teste das bitte:

    Wenn alles klappt, kommt das in eine ordentliche Funktion und der Text wird auch noch geholt.

    (Kann man die Software irgendwo laden, um den Zugriff mal zu testen?)

  • Oh verdammt

    Da hat beim Einfügen wohl der Googletranslator dazwischengefunkt grrr. So schlecht ist der Entwickler jetzt auch nicht ;) Muss ich unbedingt ausschalten sonst wird das hier Kauderwelsch. Der hat hoffentlich nicht Dein Script schon verhauen. Muss noch meine Frau verabschieden, dann gehts ans testen. Das Laden der Software wird schwierig, ist kommerziell. Wobei es gibt, glaube ich, ne Demo. Muss ich mal schauen wo das war. Die Produktseite selber ist seit Wochen semidown. (Hier entsteht...bla, bla) Soviel zum Support.

    MfG Jörg

  • >>>> Window <<<<

    Title: Light@Night - 4.1a

    Class: TLichtwerkForm

    Position: -4, -4

    Size: 1288, 992

    Style: 0x17CF0000

    ExStyle: 0x00010110

    Handle: 0x00040194

    >>>> Control <<<<

    Class: TdxBarControl

    Instance: 2

    ClassnameNN: TdxBarControl2

    Name:

    Advanced (Class): [CLASS:TdxBarControl; INSTANCE:2]

    ID: 131676

    Text: Steuerung

    Position: 0, 26

    Size: 210, 26

    ControlClick Coords: 84, 13

    Style: 0x56000000

    ExStyle: 0x00000000

    Handle: 0x0002025C

    >>>> Mouse <<<<

    Position: 84, 39

    Cursor ID: 0

    Color: 0xF2DCB2

    >>>> StatusBar <<<<

    >>>> ToolsBar <<<<

    >>>> Visible Text <<<<

    Hauptmenüs

    Steuerung

    Konfiguration


    >>>> Hidden Text <<<<

    07:11

    20x

    btnEsc1

    Abbrechen

    Anwenden

    So sollte es aussehen. Jetzt wird getestet.

    MfG Jörg

  • Kannst auch mal so versuchen:

    Einmal editiert, zuletzt von AspirinJunkie (26. September 2020 um 12:58)

  • Handle: 0x00020254 ClassName: TdxDockControl

    Handle: 0x0002025E ClassName: TdxBarControl

    Handle: 0x0002025C ClassName: TdxBarControl

    Handle: 0x00CC0B34 ClassName: Edit

    Handle: 0x006A0D8E ClassName: Edit

    Handle: 0x00020256 ClassName: TdxBarControl

    Handle: 0x000202DC ClassName: TdxDockControl

    Handle: 0x00020306 ClassName: TdxDockControl

    Handle: 0x0002027E ClassName: TdxDockControl

    Handle: 0x000401EA ClassName: TPanel

    Handle: 0x00320C16 ClassName: TProgressBar

    Handle: 0x00090D80 ClassName: TPanel

    Handle: 0x005F0BBE ClassName: TButton

    Handle: 0x00090C44 ClassName: TPanel

    Handle: 0x000A0CBA ClassName: TProgressBar

    Handle: 0x00080C3E ClassName: TButton

    Handle: 0x002A0D06 ClassName: TButton

    Handle: 0x000302D0 ClassName: TStatusBar

    Handle TdxBarControl: 0x0002025C

    +>19:09:01 AutoIt3.exe ended.rc:0

    +>19:09:01 AutoIt3Wrapper Finished.

    >Exit code: 0 Time: 0.6465

    Ich hoffe, habe es richtig umgesetzt. Ich habe den Code in ein neues AutoIt-Script eingefügt und F5 gedrückt. Das kam dabei raus. War das richtig? Ich hatte erst die Fehlermeldung das er das Programm nicht findet. Das lag aber an der Schreibweise. Ich hab sie angepasst und dann ging es. Konntest Du nicht wissen.

    MfG Jörg

  • Ah, ich glaub ich weiss jetzt was passieren sollte beim ersten Script. Es sollte ein Konsolenfenster mit den Meldungen aufgehen. Das tut es nicht. Beim zweiten Script aber geht das Konsolenfenster auf und zeigt mir die Uhrzeit. Allerdings ist mir aufgefallen, das der Finder die Uhrzeit nur liest, wenn das Programm gestoppt ist. Demzufolge steht in der Konsole auch nur die Zeit, wann gestoppt wurde. Bei laufender Uhr funktioniert es nicht.

    Ich hab jetzt die Demo gefunden, war natürlich auf dem Dongle ich Idiot. Hat allerdings 39Mb. Kann ich sie Dir per PN senden?

    Gruß Jörg

  • pasted-from-clipboard.png

    So sieht das Fenster aus. Es funktioniert auch im Hintergrund, allerdings mit der falschen Uhrzeit.

    Gruß Jörg

    Sorry AspirinJunkie. Habe erst jetzt gesehen, dass das Script von Dir war. War gestern ein bisschen wild bei mir. Auch Dir herzlichen Dank.

    Einmal editiert, zuletzt von mikush (26. September 2020 um 12:05)

    • Offizieller Beitrag

    War das richtig?

    :thumbup:

    Das Ctrl wurde also gefunden, die Handle stimmen mit dem vom Info-Tool überein.

    So sieht das Fenster aus. Es funktioniert auch im Hintergrund, allerdings mit der falschen Uhrzeit.

    Dass du die falsche Zeit bekommst.. hmm, sollte eigentlich funktionieren.

    Probiere bitte diese Version, (einfach in SciTE mit F5 ausführen) ich bin hier davon ausgegangen, dass nur eine Uhrzeit in dem Control enthalten ist und dieses einstellige Stunden mit Vornull anzeigt.

    • Offizieller Beitrag

    Hier gibt es keine Ausgaben, die Konsole öffnet sich nicht.

    Es würde eine MsgBox aufpoppen.

    Mithilfe der Demo konnte ich feststellen, dass auf der Bar 2 Edit-Ctrl enthalten sind: Uhrzeit und der Faktor. Ich kann mir zwar die Handle dafür holen - aber bekomme bisher keinen Wert ausgelesen.

    Ich probiere mal weiter.

    P.S.: Bei mir wird kein versteckter Text des Fensters angezeigt.

    • Offizieller Beitrag

    Also, das ist schon sehr seltsam.

    Ich hatte erst keinen versteckten Text. - Erst nachdem ich die Bar bewegt hatte, erschien er doch im Info-Tool. Die Variante von AspirinJunkie funktionierte dann - aber ausschließlich beim ersten Aufruf wurde die korrekte Zeit ausgegeben. Dieser Zeitwert wurde bei allen späteren Zeitabfragen erneut ausgegeben, obwohl ich zwischendurch immer wieder die aktuelle PC-Zeit übernommen habe.

    Erst nach erneutem Bewegen der Bar konnte die korrekte Zeit ausgelesen werden.

    Das lässt sich reproduzieren:

    - Neustart Software: Kein versteckter Text - Zeit nicht ablesbar

    - Manuelles Verschieben der Bar: Text wird in den Fensterbereich "versteckter Text" übertragen

    - solange die Bar nicht erneut bewegt wird, bleibt der zuletzt gelesene Zeitwert unverändert

    Auf Grundlage dessen denke ich, dass dieser Weg nicht zielführend ist.

    Falls das nicht so funktionieren wird gäbe es noch einen zweiten Lösungsansatz. Das Lichtprogramm sendet seine aktuelle Zeit per Netzwerk an ein ein anderes Programm dieses Entwicklers auf einem Raspi welches ich installiert habe um die aktuelle Zeit auf einem Ipad zu sehen wenn das Programm Im Hintergrund läuft.

    Kannst du dieses Programm mal posten (bzw. das Client-Programm des Raspi)? Vermutlich kann man darin IP-Adresse/Port auslesen, wohin gesendet wird. Netzwerk ist nicht meine Spezialstrecke, aber da wird sich hier sicher der eine oder andere finden, der dann weitere Ideen hat.

  • So, ich habe in der Zwischenzeit mal ein bisschen mit Wireshark gespielt um den Transfer vom Programm zum Clienten auf dem Raspi zu verfolgen.Natürlich sagen mir die Daten nichts aber vielleicht könnt ihr etwas herauslesen, was irgendwie mit Zeit zu tun hat. Filtert nach UDP-Port 11080. Gestreamt habe ich von 6.30 - 6.40 Uhr (Modellzeit) mit Zeitfaktor 20 also reale 30sek. Die Daten können natürlich auch verschlüsselt sein, sieht aber nicht so aus. Obwohl, für mich sind sie es auch so ;-).

    Das Ganze falls die erste Variante nicht zum Ziel führen sollte, obwohl ich vollstes Vertrauen in BugFix und euch alle habe.

    Gruß Jörg

  • Sorry BugFix

    Hatte Deinen letzten Post glatt überlesen. Ich hatte soetwas befürchtet, deshalb der Titel. Trotzdem vielen Dank für Deine Mühen.

    Vielleicht kann jemand etwas mit dem Wireshark-Mitschnitt anfangen. Die IP vom Raspi ist die 192.168.5.55, die lokale die .1

    Ich denke dort ist die Uhrzeit in Hex oder so versteckt Aber das sind für mich Böhmische Dörfer. Da muss ein Profi drüberschauen.

    AspirinJunkie

    Habe eben erst bemerkt dass ein Script von Dir stammt. Herzlichen Dank auch für Deine Mühen.

    Wenn das ganze auch nicht zum Ziel führen sollte, so hilft es mir zumindest Funktionen kennenzulernen und zu verstehen.

    Also hat auch ein Fehlschlag etwas Gutes.

    Gruß Jörg

    • Offizieller Beitrag

    Ich habe mir mal das Wireshark-Protokoll angesehen. Die Zieladresse ist wohl eher: 192.168.178.55

    Aber egal.

    Hier die Aufzeichnungen von den ersten drei Paketen:

    Jeweils die letzten 15 Bytes enthalten die übertragenen Daten (ab 70 07 01).

    Was diese "70 07 01" sind kann ich nicht sagen, aber danach die drei Bytes scheinen die Uhrzeit zu sein.

    Du sagtest, dass Du die Aufzeichnung um 06:30 Uhr gestartet und bis 06:40 Uhr laufen gelassen hast.

    1. Paket: Hex 06 1e 14 = 06:30:20

    2. Paket: Hex 06 1e 28 = 06:30:40

    3. Paket: Hex 06 1f 00 = 06:31:00

    und so geht es weiter bis

    n. Paket: Hex 06 28 28 = 06:40:40

  • Ich werde mal mit UDPRecv versuchen ob ich irgendwas entlocken kann, was sich mit AutoIt verarbeiten lässt.

    Dazu musst du vorab sicher einen "Befehl" mit UDPSend verschicken, um mit UDPRecv eine Antwort darauf zu empfangen und diese auszuwerten zu können... wenn du das wüsstest, wäre dieser Thread hier überflüssig. ;)

  • Da hast Du wohl recht. Obwohl, die UDP-Befehle für das Programm habe ich. Das Problem ist, dass die Antwort auf einem anderen Port erfolgt und ich auf diesen nicht zugreifen kann. Der wird nämlich nur geöffnet, wenn ich auch das Modellbahnsteuerungsprogramm dieses Anbieters nutze. Das funktioniert nicht mal mit der Demo. Da werden zwar alle Ports geöffnet aber ich kann keinen Traffic erzeugen. Aber da bin ich noch dran.

    Deshalb ja mein Anliegen die Uhrzeit im Programmfenster abzufragen oder aus dem öffentlichen Datenstrom zu lesen.

    Du siehst, überflüssig war der Thread keinesfalls ;).

    Gruß Jörg