Forum: PC-Programmierung Linux: aktuell laufendes Programm


von Andy (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Wenn du einen Konsolenaufruf machst, ist doch genau diese Konsole im 
Vordergrund und hat den Fokus?

von yalu (Gast)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

Naja, wie gesagt:
Das 'aktive Fenster' entspricht in den allermeisten Fällen nicht dem, 
was man sich landläufig unter 'Fenster' vorstellt.

von yalu (Gast)


Lesenswert?

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
}

von Rolf Magnus (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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

von Andy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.