在Raspbian环境中,将窗口从标题栏激活

总结

根据窗口标题激活特定窗口。
由于pywin32只能在Windows环境下使用,因此可以通过subprocess在x11中执行命令。

环境

在预装标准的Raspbian系统中运行,X11已经安装完成。

将以下内容以中文原生方式改写,只需一个选项:

“コード”

import subprocess

def active_window(title):
    # xwininfoを用いて対象アプリのウインドウIDを取得する
    # https://hk29.hatenablog.jp/entry/2021/08/15/182010 から引用
    cmd_list = ['xwininfo', '-root', '-tree', '|', 'grep', title]
    cmd = ' '.join(cmd_list)
    result = subprocess.run(cmd, encoding='UTF-8', shell=True,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    app_id = result.stdout.split()[0]
    
    # xdotoolを用いて、ウインドウIDから対象アプリをアクティブ化
    cmd_list = ['xdotool', 'windowactivate', app_id]
    cmd = ' '.join(cmd_list)
    subprocess.run(cmd, shell=True)

if __name__ == '__main__':
    active_window('Minecraft')

详细

subprocess的大致理解

subprocess是一个可以执行其他应用程序的库。
通过subprocess.run(“执行命令”)或subprocess.popen(“执行命令”)可以执行命令。
run会一直等待启动的应用程序结束才会继续执行后续操作,而popen则不需要等待应用程序结束就可以继续执行后续操作。

可能的一个翻译为:
尽管上述代码是通过“run”来执行的,但如果想要从代码中启动其他应用并使用pyautogui来操作该应用,或许使用popen可能更好。

使用过的subprocess选项

将选项设置为`shell=True`时,它会从shell中执行命令。
默认情况下,选项为`shell=False`,如果在执行命令中包含exe文件路径,则会直接执行。

通过设置 stdout=subprocess.PIPE, stderr=subprocess.PIPE,可以将执行的命令作为返回值获取。此时,如果不设置 encoding=’UTF-8’,输出将以二进制值返回。

使用xwininfo来获取窗口ID。

实际使用的代码引自https://hk29.hatenablog.jp/entry/2021/08/15/182010。

    cmd_list = ['xwininfo', '-root', '-tree', '|', 'grep', title]
    cmd = ' '.join(cmd_list)
    result = subprocess.run(cmd, encoding='UTF-8', shell=True,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    app_id = result.stdout.split()[0]

xwininfo是一个可用于获取窗口信息的X11库。您还可以使用选项来获取窗口的大小和位置。参考网址:https://kledgeb.blogspot.com/2012/12/ubuntu-xwininfo-1.html

使用-name选项指定标题非常方便,但必须完全匹配才能使用。所以使用’-root’、’-tree’选项获取与根窗口相连的所有窗口信息,并从中提取仅包含特定字符串的窗口,使用| grep “标题”进行过滤。

这个输出是一个包含除了窗口ID外其他信息的字符串,但是可以通过拆分后的第一个部分获取ID。
如果标题中包含空格,那么它也会被拆分,所以如果想获取大小或位置信息,需要注意。

使用xdotool激活目标应用程序

    cmd_list = ['xdotool', 'windowactivate', app_id]
    cmd = ' '.join(cmd_list)
    subprocess.run(cmd, shell=True)

xdotool 是一个用于窗口操作的X11库。
参考网址:https://mackro.blog.jp/archives/9856283.html

最后

在非Windows环境中,现在可以激活指定的应用程序了。
今后,我打算使用pyautogui来自动化我的工作,但是由于解释pyautogui的网站通常也同时使用pywin32,所以可能需要再次进行类似的操作。

bannerAds