Applescript で、メニュー項目が選択/フォーカスされているかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/69030

  •  09-06-2019
  •  | 
  •  

質問

アプリケーションのヘルプ メニューの検索ボックスに焦点を当てる OS X 10.5 用のスクリプトがあります。私はこれをキーの組み合わせに設定しており、Spotlight と同じように、スクリプトの実行時に切り替えるようにしたいと考えています。そこで、検索ボックスがすでに入力用にフォーカスされているかどうかを検出し、フォーカスされている場合は、[ヘルプ] メニューをクリックする代わりに Esc キーを入力したいと考えています。

現時点でのスクリプトは次のとおりです。

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

そして私は次のようなことを考えています:

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

...しかし、このエラーが発生します:

{アプリケーション「システムイベント」のアプリケーションプロセス「スクリプトエディタ」のメニューバー項目「ヘルプ」のメニューバー項目「ヘルプ」のメニュー項目1}にフォーカスできません。

それでは、検索ボックスがすでにフォーカスされているかどうかをスクリプトで検出する方法はあるのでしょうか?


私の問題を解決したのは、 それを回避する. 。ただし、メニュー項目が選択されているかどうかを確認する方法がまだわからないため、このトピックは開いたままにします。

役に立ちましたか?

解決

/Developer/Applications/Utilities/Accessibility Tools/Accessibility Inspector.app を使用すると、組み込みのアクセシビリティ システムを使用して、マウスの下にある UI 要素のプロパティを確認できます。要素上のフォーカスをロックする cmd-F7 アクションと [更新] ボタンに特に注意してください。残念ながら、要素名とプロパティ名はスクリプト スイート内の名前と直接一致しませんが、システム イベントの辞書を参照するか、通常は正しい用語を推測することができます。

これを使用すると、2 つのことが判断できます。まず、 focused プロパティは上にありません menu item, 、むしろ、 text field 以内 menu item それは集中していることです。次に、メニュー項目には selected 財産。

これで、次のことを思いつきました。

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

これでもまだうまくいきませんが。私の知る限り、重要なイベントは発生していません。そのため、まだ何か問題がある可能性があります。 focused テキストフィールドのプロパティ。

とにかく、あなたの click 繰り返しになりますが、解決策ははるかに簡単に見えます。

他のヒント

組み込みのキーショートカット コマンド-? (Cmd+Shift+/) はすでにこのように動作しています。ヘルプ メニューの検索フィールドがまだフォーカスされていない場合はキー フォーカスを移動し、フォーカスされていない場合はメニューを閉じます。

属性を使用する必要があります AXMenuItemMarkChar.

例:

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

メニュー項目がチェックされている場合、戻り値は次のようになります。 , 、そうでない場合は、 missing value.

注記:このテストは、メニューが検査されているアプリケーションが現在実行されている場合にのみ機能します。 最前部.

Illustrator でファイルを処理するために、これを自分で行う必要があることに気づきました。

私が思いついたのは次のとおりです。

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

終わり。

これは問題なく動作し、ファイルの反復処理に使用できました。おそらく今後の自動化ではこれを何度も行う必要があるでしょう。

幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top