net*_*fin 5 python window python3
我正在使用多点触控,并尝试使用相同的手势在不同的应用程序上执行不同的操作。
我有一个 python 脚本,基本有效。
Bot 我如何在应用程序之间做出选择?如何获取活动窗口标题?
谢谢
编辑系统信息:
以下更新版本。我将保留旧答案,而不是删除获得投票的答案。
#!/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())
Run Code Online (Sandbox Code Playgroud)
或获取 xid:
print(scr.get_active_window().get_xid())
Run Code Online (Sandbox Code Playgroud)
或者(并不奇怪)获取 pid:
print(scr.get_active_window().get_pid())
Run Code Online (Sandbox Code Playgroud)
另请参阅此处获取Wnck.Window 方法。
我只是解析xprop
orxwit
和的输出wmctrl
(您可能必须wmctrl
先安装sudo apt-get install wmctrl
:)。xprop 提供了很多有关 windows 的信息。
xprop -root
Run Code Online (Sandbox Code Playgroud)
为您提供有关活动窗口的信息、窗口 ID 以及
wmctrl -l
Run Code Online (Sandbox Code Playgroud)
为您提供当前打开的窗口的列表。使用该-p
选项还可以为您提供有关窗口所属的 pid 的信息。结合起来,您可以获得所需的所有信息。
例如:
获取活动窗口(id):
-使用xprop
xprop -root
Run Code Online (Sandbox Code Playgroud)
-使用 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
Run Code Online (Sandbox Code Playgroud)
一旦我们有了窗口 ID,就可以使用 wmctrl 获取它所属的应用程序(的 pid):
注意:首先,我们必须为 wmctrl“修复”上面命令的最前面的 id(输出);wmctrl 和 xprop 的 id 略有不同:
0x381e427 (xprop)
0x0381e427 (wmctrl)
Run Code Online (Sandbox Code Playgroud)
修复上述函数的输出(使用# [1]
or的“最前面”输出# [2]
):
fixed_id = frontmost[:2]+"0"+frontmost[2:]
Run Code Online (Sandbox Code Playgroud)
然后获取最前面窗口(的应用程序)的 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
Run Code Online (Sandbox Code Playgroud)
在 python 2 中,subprocess.check_output 不可用,因此过程略有不同,并且更加详细:
获取活动窗口(id):
-使用xprop
wmctrl -l
Run Code Online (Sandbox Code Playgroud)
使用 wmctrl 和输出来获取它所属的应用程序(的 pid)# [1]
- (再次)使用(并修复)以下输出[1]
:
# [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
Run Code Online (Sandbox Code Playgroud)
获取窗口名称,使用wmctrl
和 的输出# [1]
(也使用按机器名称socket.gethostname()
分割输出)wmctrl
# [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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13047 次 |
最近记录: |