AppleScript para ativar o teclado de acessibilidade no High Sierra

1

Como posso escrever um script para ativar o teclado de acessibilidade presente no macOS High Sierra?

É claro que é possível fazer isso indo em Preferências do Sistema> Acessibilidade> Teclado> Teclado de Acessibilidade> "Ativar Teclado de Acessibilidade", mas isso exige vários cliques. Eu gostaria de um script que pode ser iniciado a partir do Dock, já que eu uso frequentemente o Teclado de Acessibilidade.

Uma ideia é usar o AppleScript; Outra idéia é encontrar o binário de teclado de acessibilidade e usar um script de shell para abri-lo.

Aqui está minha tentativa de um 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

Este script falha com o erro: "Eventos do Sistema obtiveram um erro: Não é possível obter o botão 'Teclado de Acessibilidade' da janela 'Acessibilidade' do processo de aplicação 'Preferências do Sistema'."

Se eu remover os dois últimos clickcomandos, o script não produzirá um erro, mas também não aparecerá o clique no elemento de interface do usuário "Teclado".

O que estou fazendo de errado? Desculpas se esta é uma pergunta estúpida; este é meu primeiro AppleScript.

Ou, se alguém souber a localização do binário do Accessibility Keyboard, isso também seria útil.

Henry DeYoung
fonte

Respostas:

1

Nota de atualização: Esta resposta foi originalmente escrita antes do lançamento do macOS Mojave e, como tal, para usá-lo no macOS Mojave, você precisará alterar três linhas de código .

Mudança:

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

Para:

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

O seguinte exemplo de código AppleScript funciona para mim no 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

No Editor de scripts , salvei o código AppleScript de exemplo como um aplicativo denominado Accessibility Keyboard.app , na pasta Aplicativos .

Em seguida, adicionei o Accessibility Keyboard.app a: Preferências do Sistema > Segurança e Privacidade > Privacidade > Acessibilidade

Agora eu posso abrir o Accessibility Keyboard facilmente via Spotlight , ou o Accessibility Keyboard.app pode ser arrastado e solto no Dock, de modo a ser lançado por lá.


Atualizar:

Meu exemplo original do código AppleScript era voltado para a abertura do Teclado de Acessibilidade , não para fechá-lo. Dessa forma, se ele estiver aberto e o script original for executado novamente, ocorrerá um erro. A seguinte versão do código do AppleScript de exemplo considera se o Teclado de Acessibilidade já está ou não exibido e, em caso afirmativo, o fecha.

Note que enquanto isso fecha o Teclado de Acessibilidade se ele está aparecendo, há um salto adicional para o Dock Tile de Preferências do Sistema e não é e causa outro, então uma distração visual secundária.

Exemplo de código 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

Observe que as Preferências do Sistema não precisam estar visíveis para que isso funcione e por que não há nenhum activate comando no código AppleScript de exemplo . Além disso, se as Preferências do Sistema já estiverem abertas, elas serão primeiro fechadas antes que o restante do código seja processado. Isso é feito por alguns motivos, o primeiro dos quais já foi declarado e, em segundo lugar, ver os eventos da interface do usuário processados ​​é uma distração visual e pode ser irritante.

Observe também que o valor dos delay comandos pode precisar ser ajustado para o seu sistema, e ou delay comandos adicionais podem ou não ser necessários. Ajuste os valores de e ou adicione / remova os delay comandos conforme apropriado.

Lembre-se de que, assim que o aplicativo for adicionado às Preferências do sistema > Segurança e privacidade > Privacidade > Acessibilidade e modificado a partir de então, será necessário desmarcá-lo e verificar novamente se as novas alterações podem ser processadas.


Nota: O código AppleScript de exemplo é apenas isso e não emprega nenhum tratamento de erros e destina-se apenas a mostrar uma das várias maneiras de realizar uma tarefa. O ônus é sempre sobre o usuário para adicionar / usar o tratamento de erros apropriado conforme necessário / desejado.

user3439894
fonte
Muito obrigado! Isso funciona muito bem! Para que eu entenda melhor daqui para frente, foi meu erro usar em clickvez de selecte não usar delays? Como fazer clicke selectdiferir?
Henry DeYoung
@ Henry DeYoung, para responder à sua pergunta no comentário ... De um modo geral, mas não sempre, com o script de interface do usuário para que algo seja clicado, primeiro deve ter foco. Quando as Preferências do Sistema são abertas pela primeira vez em Acessibilidade, geralmente a caixa de texto Pesquisar tem foco. Então, tentando clicar em algo na tabela na área de rolagem que não está em foco falhar e porque você tem o erro que você fez. Então, selecionando primeiro a tabela na área de rolagem, o Teclado (selecione a linha 16 da tabela 1 da área de rolagem 2) pode ser selecionado. Continua no próximo comentário ...
user3439894
@ Henry DeYoung, Agora o botão do Teclado de Acessibilidade pode ser clicado e o Teclado de Acessibilidade Habilitado pode ser verificado. Então, selectdefine o foco para um objeto enquanto clickexecuta o objeto. A conclusão é que as diferenças, conforme aplicáveis ​​e / ou necessárias em qualquer cenário de caso de uso específico, se tornam mais aparentes com a experiência do uso do Script de interface com o usuário do AppleScript.
user3439894
@ Henry DeYoung, Quanto ao uso do delay comando , isso é necessário em alguns casos de uso e não em outros, alheio se algo está errando e é uma questão de tempo, então um atraso é necessário. Muitas vezes, com a interface do usuário, os atrasos de scripts são necessários, mas nem sempre.
user3439894
Muito obrigado novamente por sua ajuda! Sua descrição de foco e selectvs. clickfaz sentido. Para que eu nem sempre precise confiar na generosidade de pessoas como você, existe um bom tutorial / documentação para o script de interface de usuário do AppleScript que você recomendaria?
Henry DeYoung
1

Baseado em seu excelente trabalho anterior, aqui está uma

Versão atualizada de 2018

Características

  • Funciona sem nenhum atraso arbitrário
  • Funciona como um toggle (mostra / esconde dependendo do estado do teclado)
  • Preserva o estado do aplicativo Preferências do Sistema
  • Usa Maçãs Enhanced Application Object Model

Código fonte

(*
 * 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

Repositório

Fork the Gist no GitHub: toggle-accessibility-keyboard-macos

Ansioso para o seu feedback, Felicidades, S

sidneys
fonte
Isso é incrível, obrigado! Por acaso você sabe se existe alguma maneira de o seu script lembrar o teclado de se esconder nos cantos quentes? Eu gosto do recurso canto quente, mas muitas vezes eu volto para minha mesa e ativo o script apenas para perceber que o teclado tinha sido escondido anteriormente devido a um evento de canto quente. Seria bom se o seu script mostrasse o teclado oculto em vez de fechá-lo. De qualquer forma, muito obrigado pela sua ajuda!
Henry DeYoung