Getting pid and details for topmost window

前端 未结 9 992
醉酒成梦
醉酒成梦 2020-12-04 13:08

Does anyone know how to get the PID of the top active window and then how to get the properties of the window using the PID? I mean properties like process name, program nam

相关标签:
9条回答
  • 2020-12-04 13:11

    Am very very late to the party, but I had a similar problem, and I think this can help someone else who has the same problem. There is a command line trick to do this, you can try execvp'ing it, or executing it redirecting the output to your code

    xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME WM_CLASS
    

    gives the window name, as well as the program name. Eg, for this tab, it gives me

    _NET_WM_NAME(UTF8_STRING) = "linux - Getting pid and details for topmost window - Stack Overflow - Mozilla Firefox"
    
    WM_CLASS(STRING) = "Navigator", "Firefox"
    
    0 讨论(0)
  • 2020-12-04 13:11

    Extracted the gist of xprop into https://github.com/mondalaci/current-window-linux

    Works but sometimes segfaults - needs to be fixed and cleaned up.

    0 讨论(0)
  • 2020-12-04 13:17

    there is a command in linux call xprop which is a utility for displaying window properties in an X server. In linux xprop -root gives you the root windows properties and also other active programs. then you can get the ID of the active window using this command:

    xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\)
    

    to get just the active window ID ( without "_NET_ACTIVE_WINDOW(WINDOW): window id # " in the beginning of the line ) use this command:

    xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
    

    now you can save this command output in a user defined variable:

    myid=xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}'
    

    xprop have an attribute call -id. This argument allows the user to select window id on the command line. We should look for _NET_WM_PID(CARDINAL) in output ... so we use this command:

    xprop -id $myid | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
    

    this gives you the topmost active window process ID.

    to be more trickey and do all things in just 1 command ... :

     xprop -id $(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}') | awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}'
    

    Now I can run these commands via my C++ program ( in linux ) using popen function, grab stdout and print or save it. popen creates a pipe so we can read the output of the program we are invoking.

    ( you can also use '/proc' file system and get more detail of a 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;
    }
    
    0 讨论(0)
  • 2020-12-04 13:17

    The PID of a window owner is stored in the X property _NET_WM_PID. Note that this is only a de-facto standard.

    You have to find the id of the window first, then you can query for the property. I don't know of any abstraction QT provides for this, so you will probably have to use xlib or xcb.

    Play with the tool xprop for starters.

    0 讨论(0)
  • 2020-12-04 13:21

    I run this command on a terminal:

    sleep 5s; ps -Flwwp $(xdotool getwindowpid $(xdotool getwindowfocus))
    

    Run it, change the focus to the relevant window, wait 5 seconds, then back to terminal. Voilà!

    0 讨论(0)
  • 2020-12-04 13:26

    Install wmctrl (from the repositories). wmctrl -lp could be what you want. You can always take a look at the source if you need it from your program.

    0 讨论(0)
提交回复
热议问题