ControlGet


Ruft unterschiedliche Arten von Informationen über ein Control ab.

ControlGet, OutputVar, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

Parameter

OutputVar

Der Name der Variablen, in der das Ergebnis von Cmd gespeichert werden soll.

Cmd, Value

Siehe unten stehende Auflistung.

Control

Entweder die ClassNN (Klassenname und Instanznummer) oder der Name/Text (Aufschrift/Inhalt) des Controls, wie sie mit dem "Window Spy" ermittelt werden können. Bei Angabe von Name/Text wird das Suchergebnis von der aktuellen Einstellung für SetTitleMatchMode beeinflusst. Wenn der Parameter leer gelassen wird, wird das oberste Control des Zielfensters verwendet.

Wenn mit dem HWND (window handle, ahk_id, eindeutige Identifikationsnummer) eines Controls gearbeitet werden soll, wird der Control Parameter leer gelassen und stattdessen ahk_id %ControlHwnd% als WinTitle Parameter angebeben. Das funktioniert auch für verborgene Controls, selbst wenn DetectHiddenWindows auf OFF gesetzt ist. Das HWND eines Controls kann z.B. mit ControlGet Hwnd, MouseGetPos oder DllCall ermittelt werden.

WinTitle

Der vollständige Titel oder ein Teil des Titels des Zielfensters (das Suchergebnis wird von SetTitleMatchMode beeinflusst). Wenn dieser und die nächsten 3 Parameter leer gelassen werden, wird das LastFoundWindow (zuletzt gefundene Fenster) verwendet. Wenn hier der Buchstabe A angegeben wird und die nächsten 3 Parameter leer gelassen werden, wird das momentan aktive Fenster verwendet. Für eine Fensterklasse wird ahk_class ExakterKlassenName (wie vom "Window Spy" angezeigt) angegeben, für eine Prozess ID (PID) ahk_pid %VarMitInhaltPID%, für eine Fenstergruppe ahk_group GroupName und für die eindeutige ID eines Fensters ahk_id %VarMitInhaltID%. Die Suche kann durch Angabe mehrerer Kriterien eingeschränkt werden. Beispiel: My File.txt ahk_class Notepad

WinText

Wenn angegeben, muss dieser Parameter den Inhalt oder einen Teil des Inhalts eines einzelnen Textelementes des Zielfensters enthalten, wie er z.B. vom mitgelieferten "Window Spy" angezeigt wird. Verborgene Textelemente werden nur gefunden, wenn DetectHiddenText vorher auf ON gesetzt wurde.

ExcludeTitle

Fenster, deren Titel diesen Wert enthalten, werden bei der Suche übergangen.

ExcludeText

Fenster, deren Text diesen Wert enthält, werden bei der Suche übergangen.

Cmd, Value

Die Cmd (Kommando) und Value (Wert) Parameter sind abhängig voneinander. Ihre Verwendung wird nachfolgend beschrieben:

List: Liefert eine Liste der Einträge eines ListViews, einer ListBox, einer ComboBox oder einer DropDownList.

ListView:

Das bekannteste Beispiel für einen ListView ist die Liste der Dateien und Ordner im Windows Explorer (auch der Desktop ist ein ListView). Die Syntax für die Abfrage eines ListViews ist:

ControlGet, OutputVar, List, Options, SysListView321, WinTitle, WinText

Wenn der Options Parameter leer gelassen wird, wird der komplette Inhalt des Controls zurückgeliefert. Jede Zeile mit Ausnahme der letzten endet mit einem Zeilenvorschubzeichen (LF: `n). Innerhalb jeder Zeile endet jedes Feld (Spalte) mit Ausnahme des letzten mit einem Tabulatorzeichen (`t).

In Options können durch Leerzeichen oder Tabulator voneinander getrennt keine oder mehr der folgenden Worte als Optionen angegeben werden:

Selected: Liefert nur die ausgewählten Zeilen. Wenn keine Zeile ausgewählt ist, wird OutputVar geleert.
Focused: Liefert nur die Zeile mit dem Eingabefokus. Wenn keine Zeile den Fokus hat, wird OutputVar geleert.
Col4: Liefert nur die vierte Spalte (Feld). 4 muss durch die Spaltennummer deiner Wahl ersetzt werden.
Count: Liefert die Anzahl aller Zeilen des Controls als einzelne Zahl.
Count Selected: Liefert die Anzahl der ausgewählten Zeilen.
Count Focused: Liefert die Zeilennummer (Position) der Zeile mit dem Eingabefokus oder 0, wenn keine Zeile den Fokus hat.
Count Col: Liefert die Anzahl der Spalten des Controls oder -1, wenn die Anzahl nicht bestimmt werden konnte.

ACHTUNG: Einige Anwendungen speichern die Inhalte ihrer ListViews geschützt, was verhindert, dass der Text ausgelesen werden kann. In diesen Fällen wird ErrorLevel normalerweise auf 0 (erfolgreiche Ausführung) gesetzt, OutputVar bleibt aber leer. Weiter ist zu beachten, dass der Abruf von Texten aus einem ListView nicht durch #MaxMem begrenzt wird.

Bei Erfolg wird ErrorLevel auf 0 gesetzt, bei Fehlern auf 1 und OutputVar wird geleert. Fehler entstehen, wenn:

1) das Zielfenster oder -control nicht existieren, 

2) das Zielcontrol nicht vom Typ SysListView32 ist, 

3) der den ListView besitzende Prozess nicht geöffnet werden konnte, vielleicht wegen fehlender Rechte oder weil er gesperrt ist, 

4) die ColN Option auf eine nicht existierende Spalte verweist.

Für den Zugriff auf die einzelnen Zeilen und Felder eines ListViews wird eine Parsing Loop wie im folgenden Beispiel verwendet:

ControlGet, List, List, Selected, SysListView321, WinTitle
Loop, Parse, List, `n ; Zeilen werden mit dem Zeilenvorschub (`n) abgeschlossen. { RowNumber := A_Index Loop, Parse, A_LoopField, %A_Tab% ; Die Felder (Spalten) in jeder Zeile sind durch Tabulatoren (A_Tab) getrennt. MsgBox Row #%RowNumber% Col #%A_Index% is %A_LoopField%. }

Als ergänzender Hinweis: Die Breite der Spalten eines ListViews kann mit SendMessage verändert werden, wie in diesem Beispiel gezeigt:

SendMessage, 4126, 0, 80, SysListView321, WinTitle  ; 4126 ist die Nachricht LVM_SETCOLUMNWIDTH.
; Oben steht 0 für die erste Spalte (1 für die zweite, 2 für die dritte, etc.) und 80 ist die neue Breite.
; Ersetze 80 durch -1 für eine automatische Anpassung an das breiteste Feld der Spalte.
; Ersetze 80 durch -2, um dasselbe unter Einbeziehung der Spaltenüberschrift zu erreichen.

ListBox, ComboBox, DropDownList:

Der gesamte Text des Controls wird zurückgeliefert, d.h., die o.a. Optionen für ListViews wie Count und Selected werden nicht unterstützt. v1.0.42+ unterstützt auch TListBox, TComboBox und möglicherweise auch Andere.

Jedes Element mit Ausnahme des letzten endet mit einem Zeilenvorschubzeichen (LF: `n). Für den Zugriff auf die einzelnen Elemente wird eine Parsing Loop wie im folgenden Beispiel verwendet:

ControlGet, List, List,, ComboBox1, WinTitle
Loop, Parse, List, `n
MsgBox Item number %A_Index% is %A_LoopField%.

Checked: Setzt OutputVar auf den Wert 1, wenn eine Checkbox oder ein RadioButton ausgewählt ist, sonst auf 0.

Enabled: Setzt OutputVar auf den Wert 1, wenn das Control aktiv ist, sonst auf 0 (deaktiviert).

Visible: Setzt OutputVar auf den Wert 1, wenn das Control sichtbar ist, sonst auf 0 (verborgen).

Tab: Setzt OutputVar auf die Nummer des aktiven Tabs in einem SysTabControl32. Der erste Tab ist 1, der zweite 2, etc. Wie stattdessen die Anzahl der Tabs in einem Tabcontrol ermittelt werden kann, zeigt dieses Beispiel:

SendMessage, 0x1304,,, SysTabControl321, WinTitle  ; 0x1304 ist TCM_GETITEMCOUNT.
TabCount = %ErrorLevel%

FindString, String: Setzt OutputVar auf die Nummer des Elements einer ListBox oder ComboBox, das den exakten Wert von String enthält (v1.0.42+ unterstützt auch TListBox, TComboBox und möglicherweise auch Andere). Das erste Element ist 1, das zweite 2, usw. Wenn es keinen Treffer gibt, wird OutputVar geleert und ErrorLevel auf 1 gesetzt.

Choice: Setzt OutputVar auf den Inhalt des aktuell ausgewählten Elements einer ListBox oder ComboBox (v1.0.42+ unterstützt auch TListBox, TComboBox und möglicherweise auch Andere). Wie stattdessen die Nummer des ausgewählten Elements ermittelt werden kann, zeigt das folgende Beispiel (nur die passende der beiden ersten Zeilen darf verwendet werden):

SendMessage, 0x188, 0, 0, ListBox1, WinTitle  ; 0x188 ist LB_GETCURSEL (für eine ListBox).
SendMessage, 0x147, 0, 0, ComboBox1, WinTitle  ; 0x147 ist CB_GETCURSEL (für eine DropDownList oder ComboBox).
ChoicePos = %ErrorLevel%  ; Ist -1, wenn kein Element ausgewählt ist.
ChoicePos += 1  ; Konvertiert den 0-basierten in einen 1-basierten Wert, so dass das erste Element mit 1 bezeichnet wird, nicht mit 0.

LineCount: Setzt OutputVar auf die Anzahl der Zeilen in einem Edit Control. Alle Edit Controls haben zumindest 1 Zeile, auch wenn das Control leer ist.

CurrentLine: Setzt OutputVar auf die Nummer der Zeile eines Edit Controls, die den Textcursor (Einfügemarke) enthält. Die erste Zeile ist 1. Wenn im Control Text ausgewählt ist, wird OutputVar auf die Nummer der Zeile gesetzt, in der die Auswahl beginnt.

CurrentCol: Setzt OutputVar auf die Nummer der Spalte eines Edit Control, in der der Textcursor (Einfügemarke) steht. Die erste Spalte ist 1. Wenn im Control Text ausgewählt ist, wird OutputVar auf die Nummer der Spalte gesetzt, mit der die Auswahl beginnt.

Line, N: Setzt OutputVar auf den Inhalt der Zeile N eines Edit Controls. Zeile 1 ist die erste Zeile. Wegen der Eigenschaften des Controls kann OutputVar sowohl mit einem Wagenrücklauf (CR: `r) als auch mit Wagenrücklauf + Zeilenvorschub (CRLF: `r`n) enden. Wenn die angegebene Zeile leer ist oder nicht existiert, wird ErrorLevel auf 1 gesetzt und OutputVar geleert.

Selected: Setzt OutputVar auf den ausgewählten Text eines Edit Controls. Wenn kein Text ausgewählt ist, wird OutputVar geleert und ErrorLevel auf 0 (d.h., kein Fehler) gesetzt. Bestimmte Arten von Controls wie RichEdit20A liefern in manchen Fällen nicht den korrekten Text (z.B. Metapad).

Style: Liefert eine 8-stellige hexadezimale Zahl, die den Gestaltungseigenschaften des Controls entspricht. Die Tabelle der Gestaltungseigenschaften enthält einige Eigenschaften und die ihnen zugeordneten hexadezimalen Werte.

ExStyle: Liefert eine 8-stellige hexadezimale Zahl, die den erweiterten Gestaltungseigenschaften des Controls entspricht.

Hwnd [v1.0.43.06+]: Liefert die eindeutige Identifikationsnummer (window handle: HWND) des angegebenen Controls. Beispiel: ControlGet, OutputVar, Hwnd,, Edit1, WinTitle. Die HWND eines Controls wird oft in PostMessage, SendMessage und DllCall verwendet.  Als ergänzender Hinweis: Die HWND eines Controls kann auch mit MouseGetPos ermittelt werden. Abschließend sei angemerkt, dass die HWND eines Controls direkt als ahk_id WinTitle verwendet werden kann (das funktioniert auch für verborgene Controls, selbst wenn DetectHiddenWindows OFF ist).

ErrorLevel

Bei erfolgreicher Ausführung wird ErrorLevel auf 0 gesetzt. Falls ein Problem auftrat, wie ein nicht existierendes Fenster oder Control, wird ErrorLevel auf 1 gesetzt und OutputVar geleert.

Anmerkungen

Im Gegensatz zu den Anweisungen, die ein Control verändern, wird nach der Ausführung von ControlGet keine automatische Pause eingelegt, d.h. SetControlDelay hat hier keine Wirkung.

Um den Namen des Controls zu bestimmen, über dem sich der Mauszeiger befindet, verwendet man MouseGetPos. Für eine Auflistung aller Controls eines Fensters verwendet man WinGet ControlList.

Bei Fenstertiteln und -texten muss die Groß/Kleinschreibung beachtet werden. Verborgene Fenster werden nur gefunden, wenn DetectHiddenWindows vorher auf ON gesetzt wurde.

Siehe auch

Control, GuiControlGet, ControlMove, ControlGetText, ControlSetText, ControlGetPos, ControlClick, ControlFocus, ControlSend, WinGet

Beispiel

ControlGet, OutputVar, Line, 1, Edit1, Ein Fenstertitel

ControlGet, WhichTab, Tab, , SysTabControl321, Ein Fenstertitel
if ErrorLevel
MsgBox Es gab ein Problem.
else
MsgBox Tab #%WhichTab% ist aktiv.