返回

如何在 GNOME 文件选择器中使用 at-spi2 输入 Ctrl-L?

Linux

使用 at-spi2 在 GNOME 文件选择器中输入 Ctrl-L

在自动化文件选择任务时,在 GNOME 文件选择器对话框中输入 Ctrl-L 非常有用。本文将分步指导您如何使用 at-spi2 在 GNOME 文件选择器中发送 Ctrl-L 键入。

搜索 Chrome 文件选择器

第一步是搜索 Chrome 文件选择器。这是使用 at-spi2 完成的。at-spi2 是一个 API,用于与辅助技术(例如屏幕阅读器)进行交互。

import atspi

def search_chrome_filechooser():
    if not atspi.is_initialized():
        err = atspi.init()
        if err != 0:
            print("Something Error:", err)
            return

    root = atspi.get_desktop(0)
    app = search_widget(root, "xdg-desktop-portal-gnome", "application")
    if app == None:
        print("app not found")
        return
    dialog = search_widget(app, role_name="dialog")
    if dialog is None:
        print("file chooser dialog not found")
        if atspi.is_initialized():
            atspi.exit()
        return

使用 at-spi2 发送键盘输入

找到文件选择器后,可以使用 at-spi2 发送键盘输入。atspi.generate_keyboard_event() 方法用于此目的。

    atspi.generate_keyboard_event(29, None, atspi.KeySynthType.PRESS)
    atspi.generate_keyboard_event(38, None, atspi.KeySynthType.PRESSRELEASE)
    if atspi.is_initialized():
        atspi.exit()

此代码将向文件选择器发送 Ctrl-L 键入。

完整示例

以下是使用 at-spi2 在 GNOME 文件选择器中输入 Ctrl-L 的完整示例:

import atspi

def search_widget(root, name: str|None=None, role_name:str|None=None):
    widget = root
    if widget == None:
        return None
    if name == None and role_name == None:
        return
    widget_name = widget.get_name()
    widget_role_name = widget.get_role_name()
    if name == widget_name and role_name == None:
        return widget
    elif name == None and role_name == widget_role_name:
        return widget
    elif name == widget_name and role_name == widget_role_name:
        return widget
    num = widget.get_child_count()
    for v in range(num):
        child = widget.get_child_at_index(v)
        if (result := search_widget(child, name, role_name)) != None:
            return result

def search_chrome_filechooser():
    if not atspi.is_initialized():
        err = atspi.init()
        if err != 0:
            print("Something Error:", err)
            return

    root = atspi.get_desktop(0)
    app = search_widget(root, "xdg-desktop-portal-gnome", "application")
    if app == None:
        print("app not found")
        return
    dialog = search_widget(app, role_name="dialog")
    if dialog is None:
        print("file chooser dialog not found")
        if atspi.is_initialized():
            atspi.exit()
        return


    atspi.generate_keyboard_event(29, None, atspi.KeySynthType.PRESS)
    atspi.generate_keyboard_event(38, None, atspi.KeySynthType.PRESSRELEASE)
    if atspi.is_initialized():
        atspi.exit()

search_chrome_filechooser()

常见问题解答

1. 为什么我无法发送 Ctrl-L 键入?

确保您已正确安装 at-spi2 绑定。您还应该检查是否具有发送键盘输入的权限。

2. 我可以使用 at-spi2 发送其他键盘输入吗?

是的,可以使用 at-spi2 发送任何键盘输入。有关详细信息,请参阅 at-spi2 文档。

3. 如何检查文件选择器是否处于焦点?

可以使用 at-spi2 的 get_active_window() 方法来检查文件选择器是否处于焦点。

4. 我可以在所有应用程序中使用此方法吗?

此方法在使用 at-spi2 的所有应用程序中都可用。但是,它可能无法在所有应用程序中正常工作。

5. 我如何获得更多有关 at-spi2 的帮助?

您可以参阅 at-spi2 文档或在网上搜索更多信息。