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.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top