Python - 如何在Ubuntu上获取焦点窗口的进程名称?(不是窗口标题)

时间:2014-02-28 16:02:38

标签: python ubuntu

我正在编写一个脚本,记录我每天在每个应用程序上花费的时间。 但我不知道如何得到我关注的过程及其名称。 我怎样才能做到这一点? 顺便说一句,我看到很多方法来获得焦点窗口ID。 我可以用它来获取进程名称吗?

1 个答案:

答案 0 :(得分:2)

你想要的是python-xlib你想要查找的地方events

作为一个使用示例,我用它来创建kitt来处理Xorg上的多点触控手势:

这是代码:

from Xlib import X, XK, protocol, display, Xcursorfont
from Xlib.ext import xtest
from Xlib.protocol import request

disp = display.Display()

root = disp.screen().root
pointer_info = request.QueryPointer(display = disp.display,
                                    window = root)
root_xpos, root_ypos = (pointer_info._data['root_x'], pointer_info._data['root_y'])
targetwindow = disp.get_input_focus().focus

现在,一旦你得到了targetwindow,就可以获得许多像id的内容。

现在,回到你的问题“如何获得一个窗口的PID”,答案就是它 不可能,因为several reasons, 虽然周围有黑客攻击。

这些黑客背后的想法是,尽管你无法分辨完全进程(以及它的PID)正在运行窗口,但你可以知道它的全名。你不能因为Xorg是一个客户端 - 服务器系统,其中应用程序可以是在远程机器上运行的进程,该进程可以具有与本地进程相同的PID。但是,黑客的想法是获取程序的全名(使用WM_CLASS属性)并从进程列表中猜出PID。

最明显的一个,使用xprop

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}")

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

甚至使用xdotool

但是,回到我们正在使用的Xlib,我很确定它可以使用代码实现 像that one, 虽然我没有现成的代码,但您必须在那里查看WM_CLASS属性。其中包含进程列表中显示的应用程序名称... tada \ o /

HTH