editar - linux easytag
Obtener pid y detalles para la ventana superior (8)
El PID de un propietario de ventana se almacena en la propiedad X _NET_WM_PID. Tenga en cuenta que esto es solo un estándar de facto.
Primero debe encontrar la identificación de la ventana, luego puede consultar la propiedad. No sé de ninguna abstracción que QT proporcione para esto, por lo que probablemente tendrá que usar xlib o xcb.
Juega con la herramienta xprop
para principiantes.
¿Alguien sabe cómo obtener el PID de la ventana activa superior y luego cómo obtener las propiedades de la ventana usando el PID? Me refiero a propiedades como el nombre del proceso, el nombre del programa, etc.
Estoy usando Qt bajo Linux (Ubuntu 9.10).
Instala wmctrl (desde los repositorios). wmctrl -lp
podría ser lo que quieras. Siempre puede echar un vistazo a la fuente si la necesita de su programa.
Una de las cosas sobre X es que es una red transparente. Es muy posible que la ventana real que se muestra en la parte superior (que tiene foco) se ejecute en una máquina que no sea la suya, en cuyo caso, la identificación del proceso del proceso que se ejecuta dentro de la ventana no tendrá sentido en su máquina.
¿Puedes elaborar un poco sobre lo que quieres hacer? Creo que hay algunos detalles faltantes aquí. Idealmente, debería trabajar en el nivel X en lugar de en el específico de la máquina.
hay un comando en linux call xprop que es una utilidad para mostrar propiedades de ventana en un servidor X. En linux xprop -root
le proporciona las propiedades de la ventana raíz y también otros programas activos. entonces puedes obtener el ID de la ventana activa usando este comando:
xprop -root | grep _NET_ACTIVE_WINDOW/(WINDOW/)
para obtener solo el ID de la ventana activa (sin "_NET_ACTIVE_WINDOW (WINDOW): window id #" al comienzo de la línea) use este comando:
xprop -root | awk ''/_NET_ACTIVE_WINDOW/(WINDOW/)/{print $NF}''
ahora puede guardar esta salida de comando en una variable definida por el usuario:
myid=xprop -root | awk ''/_NET_ACTIVE_WINDOW/(WINDOW/)/{print $NF}''
xprop tiene una llamada de atributo -id. Este argumento permite al usuario seleccionar la identificación de la ventana en la línea de comando. Deberíamos buscar _NET_WM_PID (CARDINAL) en la salida ... entonces usamos este comando:
xprop -id $myid | awk ''/_NET_WM_PID/(CARDINAL/)/{print $NF}''
esto le proporciona la ID de proceso de ventana activa más alta.
ser más trickey y hacer todas las cosas en solo 1 comando ...:
xprop -id $(xprop -root | awk ''/_NET_ACTIVE_WINDOW/(WINDOW/)/{print $NF}'') | awk ''/_NET_WM_PID/(CARDINAL/)/{print $NF}''
Ahora puedo ejecutar estos comandos a través de mi programa C ++ (en Linux) usando la función popen, grab stdout e imprimir o guardarlo. popen crea una tubería para que podamos leer el resultado del programa que invocamos.
(También puede usar el sistema de archivos ''/ proc'' y obtener más detalles de un PID (''/ proc / YOUR_PID / status''))
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
inline std::string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main()
{
//we uses // instead of / ( / is a escape character ) in this string
cout << exec("xprop -id $(xprop -root | awk ''/_NET_ACTIVE_WINDOW//(WINDOW//)/{print $NF}'') | awk ''/_NET_WM_PID//(CARDINAL//)/{print $NF}''").c_str();
return 0;
}
Llego muy tarde a la fiesta, pero tuve un problema similar, y creo que esto puede ayudar a alguien más que tenga el mismo problema. Hay un truco de línea de comando para hacer esto, puedes probar a ejecutarlo o ejecutarlo redireccionando la salida a tu código
xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d '' '' -f 5) _NET_WM_NAME WM_CLASS
da el nombre de la ventana, así como el nombre del programa. Por ejemplo, para esta pestaña, me da
_NET_WM_NAME(UTF8_STRING) = "linux - Getting pid and details for topmost window - - Mozilla Firefox"
WM_CLASS(STRING) = "Navigator", "Firefox"
Extraído la esencia de xprop en https://github.com/mondalaci/current-window-linux
Funciona, pero a veces segfaults - necesita ser reparado y limpiado.
El XGetInputFocus de XGetInputFocus
te dirá qué ventana tiene foco, que probablemente sea más interesante que la más alta. Cf. La página de manual XGetInputFocus de Xfree86 .
Si realmente es la ventana más alta, y no la ventana con foco que buscas, bueno, no creo que haya una simple llamada para hacer eso, porque xlib no parece ofrecer ninguna forma de consultar al mundo orden de apilamiento, que es la estructura de datos que le indica qué ventanas están delante de cuáles otras.
Una vez que tenga el ID de la ventana derecha, xprop
el pid en _NET_WM_PID_, aunque no todas las ventanas tienen esa propiedad ...
Posdata Más pensamientos; mucho tiempo desde que he pensado en xlib
...
Resumir:
X no ofrece ninguna asociación confiable entre los identificadores de ventanas y los pids, y como observa Noufal, las ventanas servidas en un escritorio X pueden provenir de muchas máquinas diferentes, y dos clientes remotos pueden usar el mismo PID, ya que solo es único por máquina. Cf. ¿Cómo obtener una ventana X11 desde una identificación de proceso?
X no parece ofrecer una interfaz que pregunte cuál es la ventana más alta, o si una ventana ocluye a otra. Asimismo con acceso privilegiado ... Cf. ¿Cómo identificar ventanas X11 de alto nivel usando xlib?
Los administradores de ventanas comúnmente disponibles y Qt no le dan acceso privilegiado a X
Sin una forma de encontrar la ventana más alta y una asociación confiable de la identificación de la ventana con el pid correspondiente, no podemos resolver la pregunta.
Podemos encontrar qué ventana tiene foco, y esto es probablemente lo que queremos. Pero, de nuevo, sin el wid al mapa pid ...
Entonces, lo siento, parece que no se puede hacer.
Estoy votando la respuesta de Michel Kogan y agregando este breve resumen:
ps -o pid,comm,args $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " /$0//n" _NET_ACTIVE_WINDOW | awk "{print /$2}") -f _NET_WM_PID 0c " /$0//n" _NET_WM_PID | awk "{print /$2}")
Lo anterior mostrará lo siguiente para la ventana actualmente activa: PID, nombre de comando (solo el nombre del ejecutable), comando con todos sus argumentos.