Applescript で、メニュー項目が選択/フォーカスされているかどうかを確認するにはどうすればよいですか?
-
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
終わり。
これは問題なく動作し、ファイルの反復処理に使用できました。おそらく今後の自動化ではこれを何度も行う必要があるでしょう。
幸運を!