Skript, das den Inhalt eines Fensters ausliest

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Skript, das den Inhalt eines Fensters ausliest

Re: Skript, das den Inhalt eines Fensters ausliest

Post by joschko » 23 Aug 2022, 13:45

Hi Comander Keen - hast du eine Lösung für den DNP DS620 gefunden ?

Re: Skript, das den Inhalt eines Fensters ausliest

Post by just me » 03 Jun 2022, 11:40

Du könntest noch versuchen, die Controls über Ihre Position und Größe zu bestimmen. Dazu benutzt Du erst einmal das folgende Skript, gehst mit der Maus über die Controls und drückst Strg+p:

Code: Select all

#NoEnv
^p::
MouseGetPos, X, Y, W, H, HWND, ClassNN
MsgBox, 0, Control unter der Maus, ClassNN: %ClassNN%`nX: %X% - Y: %Y% - W: %W% - H: %H%
Return
Esc::
ExitApp
Diese Werte merkst Du Dir und trägst die X, Y, W und H Werte in Dein Fensterscript ein. Dort suchst Du dann nach den passenden Controls:

Code: Select all

#NoEnv
#persistent
EditX := ?
EditY := ?
EditW := ?
EditH := ?
StaticX := ?
StaticY := ?
StaticW := ?
StaticH := ?

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
Rest := ""
Status := ""
WinGet, CtrlList, ControlList
For Each, ClassNN In StrSplit(CtrlList, "`n") {
	If (SubStr(ClassNN , 1, 4) = "Edit") {
		ControlGetPos, X, Y, W, H, %ClassNN%
		If (X = EditX) && (Y = EditY) && (W = EditW) && (H = EditH)
			ControlGetText, Status, %ClassNN %
	}
	Else If (SubStr(ClassNN , 1, 6) = "Static") {
		ControlGetPos, X, Y, W, H, %ClassNN%
		If (X = StaticX) && (Y = StaticY) && (W = StaticW) && (H = StaticH)
			ControlGetText, Rest,  %ClassNN %
	}
}
If (Rest <> "") && (Status <> "") {
	FileDelete,D:\statustool\Druckerstatus.txt
	FileAppend,%Rest%`n%Status%,D:\statustool\Druckerstatus.txt
	psScript := "D:\statustool\fa-status.ps1"
	Run, powershell.exe "%psScript%" ,, hide
} ; hier könnte noch ein Else-Zweig für eine Fehlermeldung gstehen
Return
Ich habe das nicht getestet, kann also sein, dass Du noch ein paar Fehler beseitigen musst.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 02 Jun 2022, 15:58

just me wrote:
02 Jun 2022, 10:18
Das Handle wird auch beim Erstellen des Controls 'dynamisch' vergeben. Um zuverlässig an das Handle zu kommen, musst Du das Control eindeutig identifizieren können (z.B. über die ClassNN :crazy: ).
:crazy: indeed :lol:

Das übersteigt meine nicht Vorhandenen Programmier-Kenntnisse :?

Re: Skript, das den Inhalt eines Fensters ausliest

Post by just me » 02 Jun 2022, 10:18

Die 'ClassNN' ist eine AHK/AutoIt-Erfindung. Die 'NN' (laufende Nummer) wird bei jeder Abfrage 'dynamisch' in der aktuellen Reihenfolge der Z-Achse (top->down) vergeben. Es gibt Fenster, bei denen die 'NN für ein Control davon abhängt, dass bestimmte Aktionen in einer bestimmten Reihenfolge ausgelöst wurden.

Das Handle wird auch beim Erstellen des Controls 'dynamisch' vergeben. Um zuverlässig an das Handle zu kommen, musst Du das Control eindeutig identifizieren können (z.B. über die ClassNN :crazy: ).

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 01 Jun 2022, 12:18

Es wird, wenn das Fenster offen ist, immer auch dieser Tab aktiv sein. Ich glaube, die "ClassNN" ist vielleicht zu generisch oder wird innerhalb der Tabs mehrfach genutzt? Vielleicht kann/muss man das über das Handle identifizieren?

Re: Skript, das den Inhalt eines Fensters ausliest

Post by just me » 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.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 30 May 2022, 12:39

Das war's leider nicht

Re: Skript, das den Inhalt eines Fensters ausliest

Post by BoBo » 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

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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 1431 times
screenshot1.JPG
screenshot1.JPG (89.35 KiB) Viewed 1431 times

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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...

Re: Skript, das den Inhalt eines Fensters ausliest

Post by BoBo » 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:

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by BoBo » 10 Jan 2018, 07:00

FYI. Du kannst mit AHK auch direkt die sqlite-datenbank beschreiben.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by just me » 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.

Re: Skript, das den Inhalt eines Fensters ausliest

Post by BoBo » 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()

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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!

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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:

Re: Skript, das den Inhalt eines Fensters ausliest

Post by just me » 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?

Re: Skript, das den Inhalt eines Fensters ausliest

Post by Commander Keen » 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 4283 times

Top