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 da las propiedades de la ventana raíz y también otros programas activos. entonces se puede obtener el identificador de la ventana activa utilizando este comando:
xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)
para obtener simplemente la ventana de identificación activa (sin "_NET_ACTIVE_WINDOW (ventana): Ventana ID #" en el principio de la línea) utilizan 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 un atributo llamado -i re. Este argumento permite al usuario seleccionar la identificación de la ventana en la línea de comando. Debemos buscar _NET_WM_PID (cardinal) de la producción ... así que utilice este comando:
xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
esto le da la ID del proceso ventana superior activa.
para ser más trickey y hacer todas las cosas en tan sólo 1 ... comando:
xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
Ahora puede ejecutar estos comandos a través de mi programa en C++ (en Linux) usando la función popen, la salida estándar de agarre e imprimir o guardarlo popen crea una tubería para que podamos leer el resultado del programa que invocamos.
(también se puede utilizar '/ proc' sistema de archivos 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;
}
Tu aplicación conoce su propio pid, ¿eso es lo que quieres? – Tobu
QT no es un idioma, es un juego de herramientas. QT está escrito en C++, pero tiene enlaces para muchos otros idiomas. ¿Estás usando C++? –
@JamesPolley QT no es del todo diferente de un lenguaje en que puede actuar como una herramienta de 'escribir una vez, compilar en todas partes', donde portar algo como las llamadas POSIX requeriría escribir un código separado para WinAPI, Android, etc. – Wyatt8740