Hallo zusammen, Ich suche unter Linux die Möglichkeit, dass aktuell laufende Programm, welches gerade den Fokus besitzt, zu ermitteln. Am besten mit einem einfachen Konsolenaufruf. Die Sprache ist aber prinzipiell egal Grüße Andy
Das wird dir so nicht gelingen. Das Fenster mit dem Fokus, je nach Fenstermanager und Toolkit, so ziemlich jeder Knopf, jedes Textfeld etc. sein; das liegt in der Natur von X.org. Du musst dich vermutlich mal bei KDE/Gnome unschauen.
Wenn du einen Konsolenaufruf machst, ist doch genau diese Konsole im Vordergrund und hat den Fokus?
Ich weiß nicht, ob es ein fertiges Tool dafür gibt, aber so geht es jedenfalls auch:
1 | #include <X11/Xlib.h> |
2 | #include <stdio.h> |
3 | |
4 | int main() { |
5 | Window focus; |
6 | int revert; |
7 | |
8 | XGetInputFocus(XOpenDisplay(NULL), &focus, &revert); |
9 | printf("0x%lx\n", focus); |
10 | return 0; |
11 | }
|
Klaus Wachtler schrieb: > Wenn du einen Konsolenaufruf machst, ist doch genau diese Konsole im > Vordergrund und hat den Fokus? Man kann das obige Programm aus der Konsole bspw. mit
1 | sleep 3; focus |
aufrufen und hat dann 3s Zeit, den Focus zu wechseln. Vielleicht möchte man das Tool auch aus einem Skript, das ständig im Hintergrund läuft, aufrufen.
Naja, wie gesagt: Das 'aktive Fenster' entspricht in den allermeisten Fällen nicht dem, was man sich landläufig unter 'Fenster' vorstellt.
Sven P. schrieb: > Das 'aktive Fenster' entspricht in den allermeisten Fällen nicht dem, > was man sich landläufig unter 'Fenster' vorstellt. Das hängt von der Definition von "landläufig" ab ;-) So besser?
1 | #include <X11/Xlib.h> |
2 | #include <stdio.h> |
3 | |
4 | int main() { |
5 | Display *display; |
6 | Window focus, root, parent, *children; |
7 | Atom wm_state, type=None; |
8 | unsigned long nitems, bytes_after; |
9 | unsigned int nchildren; |
10 | int revert, format; |
11 | unsigned char *prop=NULL; |
12 | |
13 | display = XOpenDisplay(NULL); |
14 | wm_state = XInternAtom(display, "WM_STATE", False); |
15 | XGetInputFocus(display, &focus, &revert); |
16 | for(;;) { |
17 | XGetWindowProperty(display, focus, wm_state, 0, 0, False, |
18 | AnyPropertyType, &type, &format, &nitems, &bytes_after, &prop); |
19 | if(prop) |
20 | XFree(prop); |
21 | if(type) |
22 | break; |
23 | XQueryTree(display, focus, &root, &parent, &children, &nchildren); |
24 | if(!parent) |
25 | break; |
26 | focus = parent; |
27 | }
|
28 | printf("0x%lx\n", focus); |
29 | return 0; |
30 | }
|
Du kannst es dann auch gleich per NetWM abfragen. Dann bekommst du das, was der Window-Manager als "aktives Fenster" ansieht. Siehe: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#id2550738
Ja, das wird schon besser. Nun musst du nur noch herausfinden, welches Rootfenster gemeint ist. dem Fenstermanager steht es ja frei, um jedes beliebige Rootfenster einer Anwendung noch weitere Rootfenster drumherumzuzeichnen... Wie sagte es jemand so treffend: X is dead. Its funeral was years ago :-D
Hi danke für die Antworten. Werde die Codebeispiele mal testen sobald ich wieder am Linux-PC sitze eine schönen Abend noch
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.