No Applescript, como posso descobrir se um item de menu está selecionado/focado?
-
09-06-2019 - |
Pergunta
Eu tenho um script para OS X 10.5 que concentra a caixa Pesquisar no menu Ajuda de qualquer aplicativo.Eu o tenho em uma combinação de teclas e, assim como o Spotlight, quero que ele alterne quando executo o script.Então, quero detectar se a caixa de pesquisa já está focada para digitação e, em caso afirmativo, digite Esc em vez de clicar no menu Ajuda.
Aqui está o script como está agora:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
click helpMenuItem
end tell
end tell
E estou pensando em algo assim:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
set searchBox to menu item 1 of menu of helpMenuItem
if (searchBox's focused) = true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
...mas recebo este erro:
Não é possível focar no {item de menu 1 do menu "Ajuda" do item "Ajuda" da barra de menus da barra de menu 1 do processo de aplicação "Editor de Script" do aplicativo "Eventos do Sistema"}.
Então, há uma maneira de fazer meu script detectar se a caixa de pesquisa já está focada?
Resolvi meu problema com trabalhando em torno disso.Ainda não sei como verificar se um item de menu está selecionado, então deixarei este tópico aberto.
Solução
Usando /Developer/Applications/Utilities/Accessibility Tools/Accessibility Inspector.app você pode usar o sistema de acessibilidade integrado para observar as propriedades do elemento da interface do usuário sob o mouse.Observe especialmente a ação cmd-F7 para bloquear o foco em um elemento e no botão Atualizar.Infelizmente, os nomes dos elementos e das propriedades não correspondem diretamente aos do conjunto de scripts, mas você pode consultar o dicionário para eventos do sistema ou geralmente adivinhar a terminologia correta.
Usando isso você pode determinar duas coisas.Primeiro, o focused
propriedade não está no menu item
, mas sim há uma text field
dentro do menu item
isso é focado.Em segundo lugar, o item de menu tem um selected
propriedade.
Com isso, eu descobri:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
-- Use reference form to avoid building intermediate object specifiers, which Accessibility apparently isn't good at resolving after the fact.
set searchBox to a reference to menu item 1 of menu of helpMenuItem
set searchField to a reference to text field 1 of searchBox
if searchField's focused is true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
Embora isso ainda não funcione.O evento principal não está disparando, pelo que posso dizer, então algo ainda pode estar errado com o focused
propriedade no campo de texto.
De qualquer forma, seu click
novamente a solução parece muito mais fácil.
Outras dicas
O atalho de tecla integrado Cmd-? (Cmd-Shift-/) já se comporta assim.Ele move o foco principal para o campo de pesquisa do menu de ajuda se ainda não estiver em foco e, caso contrário, descarta o menu.
Você precisa usar o atributo AXMenuItemMarkChar
.
Exemplo:
tell application "System Events"
tell process "Cisco Jabber"
set X to (value of attribute "AXMenuItemMarkChar" of menu item "Available" of menu "Status" of menu item "Status" of menu "File" of menu bar item "File" of menu bar 1) is "✓" -- check if Status is "Availible"
end tell
end tell
Se o item de menu estiver marcado, o valor de retorno será ✓
, caso contrário é missing value
.
Observação:Este teste só funciona se o aplicativo cujos menus estão sendo inspecionados estiver atualmente mais à frente.
Acabei de descobrir a necessidade de fazer isso sozinho para processar alguns arquivos no Illustrator.
Aqui está o que eu descobri:
tell application "Adobe Illustrator"
activate
tell application "System Events"
tell process "Illustrator"
set frontmost to true
set activeMenuItem to enabled of menu item "Unlock All" of menu "Object" of menu bar item "Object" of menu bar 1
if activeMenuItem is true then
tell me to beep 3
else
tell me to beep 2
end if
end tell
end tell
end tell
Feito.
Isso funcionou sem problemas e pode ser usado para iterar um arquivo.Provavelmente terei que fazer isso muito mais vezes em minha automação futura.
Boa sorte!