Skript, das den Inhalt eines Fensters ausliest

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 10:06

Hi, ich bin neu hier und hab von AHK keine richtige Ahnung. Programmieren kann ich auch nicht wirklich :-(

Aber ich schaffe es mit trial'n error meist, vorhandene Beispiele so einigermaßen zu verstehen und anzupassen.

Was will ich erreichen: Ich habe ein Programm, das mir diverse Statusinfos eines Fotodruckers in einem Fenster anzeigt. Einige diese Infos möchte ich gerne auslesen und in eine Textdatei schreiben.
Das ist einmal die verbleibende Papiermenge und dann der Status des Druckers (warten, Drucken, Fehler etc).
Ich würde diese werte gerne in einem gewissen Intervall (60 Sekunden) auslesen. Der neue Wert soll den alten im Logfile überschreiben.

Mit Winspy habe ich die Class und ClassNN des jeweiligen Bereichs ermittelt, der ausgelesen werden soll. Kann mir jemand ein Beispielskript oder zumindest das Gerüst für solch einen Task schicken?

Vielen Dank schonmal im Voraus!
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 10:51

Die etwas 'professionellere' methode wäre das abgreifen solcher infos über den treiber. Dazu gibt es schon einige brauchbare scripte im (mutter)form.
Das abfragen im interval würde mittels SetTimer-routine bewerkstelligt.
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 11:08

Das wäre natürlich toll, ich bezweifle aber, dass es für diesen Drucker etwas gibt, ist ein Thermosublimationsdrucker von DNP, der DS-RX1.
Meine umfassende Recherche im Netz hat zumindest ergeben, dass man diese Werte nicht einfach so an anderer Stelle abgreifen kann. Aber ich lasse mich gern eine Besseren belehren...
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 11:25

Moin,

es wäre hilfreich, wenn Du uns die per WinSpy ermittelten Daten der für Dich interessanten Controls und eine Beschreibung / Beispiel des jeweiligen Inhalts zur Verfügung stellen könntest. Wenn Du die Daten alle 60 Sekunden aus einem Programmfenster abgreifen willst, muss das Programm auch alle 60 Sekunden zumindest für kurze Zeit laufen. Willst Du das wirklich so?
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 13:05

Ja, das Fenster soll permanent offen sein. Vielleicht funktioniert es auch, wenn es minimiert ist, das wäre aber nicht so wichtig. Ich mache nachher mal einen Screenshot und poste die Classes aus Winspy. THX!
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

08 Jan 2018, 15:06

Hier ist der Screenshot. Ich habe die relevanten Bereiche eingefärbt. Ich hoffe, das hilft als Info weiter?

gelber Bereich:
Handle: 0x3063C
Class: WindowsForms10.STATIC.app.0.378734a
ClassNN: WindowsForms10.STATIC.app.0.378734a16

roter Bereich:
Handle: 0x20644
Class: WindowsForms10.EDIT.app.0.378734a
ClassNN: WindowsForms10.EDIT.app.0.378734a1
RX1-Screenshot.jpg
RX1-Screenshot.jpg (83.46 KiB) Viewed 4278 times
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Skript, das den Inhalt eines Fensters ausliest

09 Jan 2018, 04:40

Moin,

danke für die Info. Du kannst mal Folgendes probieren:

Starte das Statusprogramm und anschließend folgendes (ungetestetes) Skript:

Code: Select all

#NoEnv
WinTitle := "RXI Information"

^+a:: ; Hotkey Strg+Shift+a -> Werte auslesen
If !WinExist(WinTitle) ; bei Erfolg wird das 'Zuletzt Gefundene Fenster' gesetzt -> https://ahkde.github.io/docs/misc/WinTitle.htm
{
   MsgBox, 16, Test, Das Fenster %WinTitle% wurde nicht gefunden! ; der Fenstertitel stimmt offensichtlich nicht
   Return
}
ControlGetText, Gedruckt, WindowsForms10.STATIC.app.0.378734a16
ControlGetText, Status, WindowsForms10.EDIT.app.0.378734a1
MsgBox, 0, Ergebnis:`nBlattzähler: %Gedruckt%`nDruckerstatus: %Status%
Return
Wenn Du dann den Hotkey Strg+Shift+a auslöst und die richtigen Daten ausgegeben werden, bist Du auf dem richtigen Weg.

Übrigens: Muss bei ständig offenem Fenster der Button Aktualisieren gedrückt werden, damit die Werte neu eingelesen werden?
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

09 Jan 2018, 07:14

@just me, das funktioniert, vielen Dank dafür! :superhappy:

Ich versuch dann mal, mich durchzuwurschteln bezüglich Ausgabe in ein Logfile etc...

Und Nein, der Wert wird automatisch aktualisiert :bravo:
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 05:28

So, das Skript läuft jetzt soweit.
Was nicht funktioniert, ist das Schreiben in die Datei im Else-Teil, also wenn das Fenster nicht gefunden wurde.
Es hat schon funktioniert, jetzt plötzlich nicht mehr. Und ich finde nicht raus, was ich geändert habe:think:

Code: Select all

#NoEnv
#persistent
SetTimer, Statusauslesen, 10000
Return
Statusauslesen:
WinTitle := "RX1 Information"
If !WinExist(WinTitle) ; bei Erfolg wird das 'Zuletzt Gefundene Fenster' gesetzt -> https://ahkde.github.io/docs/misc/WinTitle.htm
{
  FileDelete, Druckerstatus.txt
  FileAppend,--- `nRX1-Tool nicht aktiv, Druckerstatus.txt
}
ControlGetText, Rest, WindowsForms10.STATIC.app.0.378734a16
ControlGetText, Status, WindowsForms10.EDIT.app.0.378734a1
FileDelete, Druckerstatus.txt
FileAppend, %Rest% `n%Status%, Druckerstatus.txt
Return
Darüber hinaus die Frage: ist es möglich, den Inhalt auszulesen, wenn das Fenster minimiert ist?
Edit: Nevermind, hab's gefunden:

Code: Select all

 DetectHiddenWindows, On
Ich liebe AHK!
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 06:00

Ich sehe kein else, damit würde die section nach dem if grundsätzlich ausgeführt, überschreibt also das if-gedöns (?)
!Winexist() <> WinExist()
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 06:23

Moin,

BoBo hat recht. Und in meinem Beispiel war das

Code: Select all

If !WinExist(WinTitle) ; bei Erfolg wird das 'Zuletzt Gefundene Fenster' gesetzt -> https://ahkde.github.io/docs/misc/WinTitle.htm
{
   MsgBox, 16, Test, Das Fenster %WinTitle% wurde nicht gefunden! ; der Fenstertitel stimmt offensichtlich nicht
   Return ; <<<<<
}
SetTimer, Statusauslesen, 10000 started den Timer alle 10 Sekunden. Der Timer hinterlässt dann genau eine Zeile in der Statusdatei. Mir erschleßt sich der Sinn bisher nicht.
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 06:49

Das kommt davon, wenn man keine rechte Ahnung vom Coden hat, jetzt funktioniert es wieder, danke!

Der Sinn ist der folgende:
Das Skript liest alle 10 Sekunden die Werte aus und schreibt sie in eine Textdatei. Diese Textdatei wird von einem Powershell-Skript ausgelesen, das diese Werte in eine sqlite-Datenbank schreibt. Und ich kann dann auf einem Webinterface ablesen, wie der Status des Drucker ist und wieviele Bilder noch gedruckt werden können.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 07:00

FYI. Du kannst mit AHK auch direkt die sqlite-datenbank beschreiben.
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 07:18

Das dachte ich mir schon, AHK kann ja scheinbar alles.
Aber das Skript macht noch mehr Sachen und existiert auch schon. Da ist dieser Umweg vermutlich einfacher.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 09:09

Falls du an das PS rankommst, ließe sich mal schaun ob das alles in gänze mit AHK machbar ist. Erspart eine schnittstelle - denn jede zusätzliche birgt ein potentielles (laufzeit)risiko (oder sei es, das der PS-guru in eurem laden im lotto gewinnt ;) ).

... Erm, und außerdem - AFAIK läßt sich ein PS-script sogar direkt in AHKcode einbetten :mrgreen:
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

10 Jan 2018, 10:21

@BoBo, danke für das Input! Da kümmert sich dann das Zukunfts-ich drum :lol:

Du hast natürlich recht, wäre besser wenn alles aus einem Guss ist...
Commander Keen
Posts: 17
Joined: 08 Jan 2018, 09:54

Re: Skript, das den Inhalt eines Fensters ausliest

29 May 2022, 09:38

Die letzten 4 Jahre lief das Skript ohne Probleme und ich bin immer noch begeistert. Nun möchte ich gern die Infos aus einem anderen Druckermodell auslesen. Sieht im Prinzip gleich aus, ist aber scheinbar eine andere Art von Fenster.

ich benötige die Werte aus Screenshot1 und Screenshot2

Das Skript so anzupassen hat nicht funktioniert:

Code: Select all

#NoEnv
#persistent
Menu, Tray, Icon, tray.ico ; spezielles icon benutzen (muss im gleichen Ordner liegen)
SetTimer, Statusauslesen, 30000 ; Ausführen des Bereiches "Statusauslesen", Intervall in ms, 60sec=60000
return
Statusauslesen: 
WinTitle := "Druckeinstellungen für DP-DS620"
If !WinExist(WinTitle) ; Solange das Fenster nicht existiert, wird eine Fehlermeldung in die Druckerstatus-Datei geschrieben
{
  FileDelete,D:\statustool\Druckerstatus.txt
  FileAppend,---`nRX1-Tool nicht aktiv,D:\statustool\Druckerstatus.txt
  psScript := "D:\statustool\fa-status.ps1"
  Run, powershell.exe "%psScript%",, hide
  Return
}
; Wenn das Fenster existiert, werden die Werte ausgelesen und in die Druckerstatus-Datei geschrieben
ControlGetText, Rest, Static2
ControlGetText, Status, Edit1
FileDelete,D:\statustool\Druckerstatus.txt
FileAppend,%Rest%`n%Status%,D:\statustool\Druckerstatus.txt
psScript := "D:\statustool\fa-status.ps1"
Run, powershell.exe "%psScript%" ,, hide
Return
Hat jemand eine Idee?
Attachments
Screenshot2.JPG
Screenshot2.JPG (89.51 KiB) Viewed 1426 times
screenshot1.JPG
screenshot1.JPG (89.35 KiB) Viewed 1426 times
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Skript, das den Inhalt eines Fensters ausliest

30 May 2022, 01:45

Nur so ein Verdacht… :think:
ControlGetText, Rest, Static2
ControlGetText, Status, Edit1

vs.
ControlGetText, Rest, ahk_class Static2
ControlGetText, Status, ahk_class Edit1
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Skript, das den Inhalt eines Fensters ausliest

31 May 2022, 03:54

Moin,

das Fenster 'Druckeinstellungen ..." hat mehrere Tabs. Bist Du sicher, dass immer der richtige Tab aktiv ist?
Ansonsten könntest Du noch versuchen, Dein Skript als Admin auszuführen.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Meister Lampe and 25 guests