【问题标题】:Python - How do I get the process name of the focused window on Ubuntu?(not the window title)Python - 如何在 Ubuntu 上获取焦点窗口的进程名称?(不是窗口标题)
【发布时间】:2014-02-28 16:02:38
【问题描述】:

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

【问题讨论】:

标签: python ubuntu


【解决方案1】:

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

作为一个使用示例,我用它创建了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, 虽然有一些黑客攻击。

这些 hack 背后的想法是,虽然您无法知道哪个确切进程(以及它的 PID)正在运行该窗口,但您可以知道它的全名。你不能,因为 Xorg 是一个客户端-服务器系统,其中应用程序可以是在远程机器上运行的进程,它可以具有与本地进程相同的 PID。但是,hack 的想法是获取程序的全名(使用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

【讨论】:

  • 感谢您的建议。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多