AppleScript打开High Sierra中的辅助功能键盘


1

如何编写脚本来打开macOS High Sierra中的辅助功能键盘?

当然可以通过转到系统偏好设置>辅助功能>键盘>辅助功能键盘>“启用辅助功能键盘”来执行此操作,但这需要多次单击。我想要一个可以从Dock启动的脚本,因为我经常使用辅助功能键盘。

一个想法是使用AppleScript; 另一个想法是找到辅助功能键盘二进制文件并使用shell脚本打开它。

这是我对AppleScript的尝试:

tell application "System Preferences"
    activate
    reveal (pane id "com.apple.preference.universalaccess")
end tell

tell application "System Events" to tell application process "System Preferences"
    tell window "Accessibility"
        click UI element "Keyboard" of row 16 of table 1 of scroll area 2
        click button "Accessibility Keyboard"
        click checkbox "Enable Accessibility Keyboard"
    end tell
end tell

此脚本失败并显示错误:“系统事件出错:无法获取应用程序进程'系统首选项'窗口'辅助功能'的按钮'辅助功能键盘'。”

如果我删除最后两个click命令,脚本不会产生错误,但似乎也没有单击“键盘”UI元素。

我究竟做错了什么?如果这是一个愚蠢的问题,请道歉; 这是我的第一个AppleScript。

或者,如果有人知道辅助功能键盘二进制文件的位置,那也会有所帮助。

Answers:


1

更新注意:这个答案最初是在macOS Mojave发布之前编写的,因此要在macOS Mojave中使用它,你需要更改三行代码

更改:

  • select table 1 of scroll area 2
  • select row 16 of table 1 of scroll area 2
  • tell tab group 1

至:

  • select table 1 of scroll area 1
  • select row 16 of table 1 of scroll area 1
  • tell tab group 1 of group 1

以下示例 AppleScript 代码macOS High Sierra下适用于我:

if running of application "System Preferences" then
    quit application "System Preferences"
    delay 1
end if
tell application "System Preferences"
    reveal pane id "com.apple.preference.universalaccess"
    delay 1
    tell application "System Events"
        tell window 1 of application process "System Preferences"
            select table 1 of scroll area 2
            delay 0.1
            select row 16 of table 1 of scroll area 2
            delay 0.1
            tell tab group 1
                click radio button "Accessibility Keyboard"
                delay 0.1
                click checkbox "Enable Accessibility Keyboard"
            end tell
        end tell
    end tell
    quit
end tell

脚本编辑器,我救例如 AppleScript的 代码作为应用程序,命名为辅助Keyboard.app,在应用程序文件夹中。

接下来,我将Accessibility Keyboard.app添加到:系统首选项 > 安全和隐私 > 隐私 > 辅助功能

现在我可以通过Spotlight轻松打开辅助功能键盘,或者可以在Dock上拖放辅助功能键盘.app以便在那里启动。


更新:

我的原始示例 AppleScript 代码适用于打开辅助功能键盘,而不是关闭它。因此,如果它打开并且原始脚本再次运行则会出错。以下版本的AppleScript 示例 代码说明它是否已显示的辅助功能键盘,如果是,则将其关闭。

注意认为,虽然这确实关闭辅助键盘,如果它显示,存在添加反弹至停靠瓦系统首选项,而不是并发出其他然后一个次级视觉分心。

示例 AppleScript 代码

if running of application "System Preferences" then
    quit application "System Preferences"
    delay 1
end if
tell application "System Preferences"
    reveal pane id "com.apple.preference.universalaccess"
    delay 1
    tell application "System Events"
        tell window 1 of application process "System Preferences"
            select table 1 of scroll area 2
            delay 0.1
            select row 16 of table 1 of scroll area 2
            delay 0.1
            tell tab group 1
                click radio button "Accessibility Keyboard"
                delay 0.1
                if value of checkbox "Enable Accessibility Keyboard" is 0 then
                    click checkbox "Enable Accessibility Keyboard"
                else
                    click checkbox "Enable Accessibility Keyboard"
                    delay 1
                    my clickOK()
                end if
            end tell
        end tell
    end tell
    quit
end tell

on clickOK()
    tell application "System Events" to click button "OK" of window 1 of application process "System Preferences"
end clickOK

请注意,系统预置不需要可见这个工作,为什么没有activate 命令例子 的AppleScript 代码。此外,如果系统偏好设置已打开,则在处理其余代码之前首先关闭它。这样做有几个原因,第一个原因已经说明,其次是看到处理的UI事件是一种视觉分心,可能很烦人。

另请注意,可能需要为系统调整命令,或者可能需要或不需要其他命令。根据需要调整和/或添加/删除命令的delay delay delay

请记住,一旦将应用程序添加到“ 系统偏好设置” >“ 安全和隐私” >“ 隐私” >“ 辅助功能”并在此后进行了修改,您将需要取消选中该设备并重新检查它,以便允许处理新的更改。


注:例子 的AppleScript 代码就是这样,不使用任何错误处理,仅是为了展示的途径之一完成的任务。用户有责任根据需要添加/使用适当的错误处理


非常感谢!这很棒!所以我更好地理解前进,我的错误在于使用clickselect不是使用delays?怎么做clickselect不同?
Henry DeYoung

@Henry DeYoung,在评论中回答你的问题......一般来说,但不是总是说,为了点击某些东西,使用UI脚本,它首先必须有焦点。当系统首选项首次打开到辅助功能时,搜索文本框通常具有焦点。因此,尝试单击滚动区域中未处于焦点的表中的某些内容会失败,以及为什么会出现错误。因此,首先在滚动区域中选择表格,然后可以选择键盘(选择滚动区域2的表格1的第16行)。接下来的评论...
user3439894

@Henry DeYoung,现在可以单击辅助功能键盘按钮,并可以检查启用辅助功能键盘。因此,select在对象click操作时将焦点设置为对象。最重要的是,根据使用AppleScript UI脚本的经验,任何特定用例场景中适用和/或必要的差异都会变得更加明显。
user3439894

@Henry DeYoung,关于delay 命令的使用,这在某些用例中是必要的,而在其他情况下则是必要的,如果出现错误并且这是一个时间问题则不经意地需要延迟。通常使用UI Scripting延迟是必要的,但并非总是如此。
user3439894

再次感谢您的帮助!您对焦点和select对比的描述click很有意义。所以我并不总是需要依赖像你这样的人的慷慨,是否有一个很好的教程/文档,你会推荐AppleScript UI脚本?
Henry DeYoung

1

根据您以前的出色工作,这里是一个

更新了2018年版本

特征

  • 工作没有任何延迟
  • 用作切换(根据键盘状态显示/隐藏)
  • 保留“系统偏好设置”应用的状态
  • 使用苹果 Enhanced Application Object Model

源代码

(*
 * toggle-macos-accessibility-keyboard
 * applescript
 *
 * description:
 * macOS automation script to toggle the macOS Accessibility Keyboard.
 * Shows and hides the keyboard depending on its current state.
 *
 * author: sidneys
 * homepage: http://sidneys.github.io
 * version: 2.0.1
 * license: MIT
 *)

-- Init
use AppleScript version "2.7"
use scripting additions

-- Persist start-up state of the "System Preferences" app
set didRunSystemPreferences to (get running of application "System Preferences")

-- Initialize storage for the checkbox value
set initialCheckboxValue to -1
set currentCheckboxValue to -1

-- Show "Keyboard" pane within the Accessibility preferences
tell application "System Preferences"
    reveal anchor 2 of pane id "com.apple.preference.universalaccess"
end tell

-- Start automated interaction
tell application "System Events"

    -- Wait for: System Preferences Window
    repeat until tab group 1 of window 1 of process "System Preferences" exists
    end repeat

    -- Wait for: Settings Pane
    repeat until (name of second radio button of tab group 1 of window 1 of process "System Preferences") is "Accessibility Keyboard"
    end repeat

    -- Select the "Accessibility Keyboard" Segmented Control
    click radio button 2 of tab group 1 of window 1 of process "System Preferences"

    -- Tick the "Enable Accessibility Keyboard" checkbox, remembering its before/after value
    set initialCheckboxValue to value of checkbox 1 of tab group 1 of window 1 of process "System Preferences"
    click checkbox 1 of tab group 1 of window 1 of process "System Preferences"
    set currentCheckboxValue to value of checkbox 1 of tab group 1 of window 1 of process "System Preferences"

    -- Did the checkbox value change?
    if initialCheckboxValue is currentCheckboxValue then
        -- No - Wait for: confirmation dialog
        repeat until sheet 1 of window 1 of process "System Preferences" exists
        end repeat
        -- Dismiss dialog
        click button 1 of sheet 1 of window 1 of process "System Preferences"
    end if

end tell

-- Did the "System Preferences" app run on start-up?
if not didRunSystemPreferences then
    -- No - Quit
    quit application "System Preferences"
else
    -- Yes - Return to the overview screen
    tell application "System Events"
        click menu item 3 of menu 1 of menu bar item 4 of menu bar 1 of process "System Preferences"
    end tell
end if

知识库

在GitHub上分享要点:toggle-accessibility-keyboard-macos

期待您的反馈,干杯,S


这太棒了,谢谢!您是否碰巧知道脚本是否有任何方法可以让键盘无法隐藏在热门角落?我喜欢热门角落功能,但我经常回到我的桌面并激活脚本,只是为了意识到键盘之前因为热门角落事件而被隐藏起来。如果你的脚本显示隐藏的键盘而不是关闭它会很好。无论如何,非常感谢你的帮助!
Henry DeYoung
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.