旧答案:

旧答案:

我正在使用多点触控,并尝试使用相同的手势在不同的应用程序上做不同的事情。

我有一个 python 脚本,基本可以工作。

那么我该如何在应用程序之间做出选择?如何获取活动窗口标题?

谢谢

编辑系统信息:

  • Python 2.7.6
  • Ubuntu 14.04(Unity)

答案1

以下是更新后的版本。我将保留旧答案,以免删除获得投票的答案。

#!/usr/bin/env python3

import gi
gi.require_version("Wnck", "3.0")
from gi.repository import Wnck

scr = Wnck.Screen.get_default()
scr.force_update()
print(scr.get_active_window().get_name())

或者获取 xid:

print(scr.get_active_window().get_xid())

或者(不太奇怪)获取 pid:

print(scr.get_active_window().get_pid())

另请参阅此处获取Wnck.Window 方法


旧答案:

xprop我只是解析或xwit和的输出wmctrl(你可能必须wmctrl先安装sudo apt-get install wmctrl:)。xprop 给出很多关于窗户的信息。

xprop -root

提供有关活动窗口的信息,包括窗口 ID,以及

wmctrl -l

为您提供当前打开的窗口列表。使用该-p选项还可为您提供有关窗口所属 pid 的信息。结合起来,您可以获得所需的所有信息。

例如:

在python 3中,使用子进程check_output():

获取活动窗口(id):

-使用 xprop

# [1]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip()

print(frontmost)
> 0x38060fd

-使用 xprop,在 python“内部”​​解析它

# [2]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip().split()[-1]

print(frontmost)
> 0x38060fd

一旦我们有了 window-id,就可以使用 wmctrl 获取其所属应用程序的 (pid):

注意:首先,我们必须“修复”上述 wmctrl 命令的最前面的 id(输出);wmctrl 和 xprop 的 id 略有不同:

0x381e427 (xprop)
0x0381e427 (wmctrl)

修复上述函数的输出(使用# [1]或 的“最前面”输出# [2]):

fixed_id = frontmost[:2]+"0"+frontmost[2:]

然后获取最前面的窗口(应用程序)的 pid:

command = "wmctrl -lp"
window_pid = [l.split()[2] for l in subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").splitlines() if fixed_id in l][0]

> 6262


在python 2中,使用subprocess.Popen():

在 python 2 中,subprocess.check_output 不可用,因此过程略有不同,并且更为冗长:

获取活动窗口(id):

-使用 xprop

# [1]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW"                                       
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
frontmost = output.communicate()[0].decode("utf-8").strip().split()[-1]

print frontmost
> 0x38060fd

使用 wmctrl 和输出来获取它所属的应用程序(的 pid)# [1]

-(再次)使用(并修复)输出[1]

# [2]
import subprocess

fixed_id = frontmost[:2]+"0"+frontmost[2:]

command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_pid = [l.split()[2] for l in output.communicate()[0].decode("utf-8").splitlines() if fixed_id in l][0]

print window_pid # pid of the application
> 6262

获取窗口姓名,使用wmctrl和的输出# [1] (也使用按机器名称socket.gethostname()拆分的输出)wmctrl

# [3]
import subprocess
import socket

command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_list = output.communicate()[0].decode("utf-8")
window_name = [l for l in window_list.split("\n") if fixed_id in l][0].split(socket.gethostname()+" ")[-1]

print window_name

人xprop
人机控制
男人 xwit

相关内容