SSブログ

入力ソースを切り替える(MacOS12.x版) [AppleScript辞書はつくれるか?]

image220823a.jpg

 

以前にも言語切り替えの入力メニューをApplescriptから操作するスクリプトを組んでいました。

 

『システムイベントを使って入力モードを変更する』 > https://start-mac.blog.ss-blog.jp/2019-03-27 

 

Mac OS 10.13では今でも使えているのですが、現在のMac OS 12.4では使えなくなっていましたので、新しいものを考えてみます。

 

 概要   

 MacOS 12.x環境で、Applescriptを使って入力ソースを『日本語』に変更したい

 

 Contents  

 1)ショートカットがあれば疑似入力でできるのでは?

 2)キーボードについている『かな』キーを擬似的に押した状態を作ったら?

 3)メニューを擬似クリックしてみる

 4)メニューを座標でクリック

 5)入力ソースをキーボードショートカットで変更する

 

1)ショートカット入力で切り替える  

仕方がないのでSystem Events経由でショートカットの疑似入力に変更しようかと思ったのですが、

公式サイトに書いてあるやり方

(https://support.apple.com/ja-jp/guide/japanese-input-method/jpimf6ffb247/6.3/mac/12.0)

『キーボード: Control+Shift+Jキー、またはOption+Shift+Zキーを押す』とあるのですが、なぜかこれでは動かなかった。

 

2)キーボードについている『かな』キーを擬似的に押した状態を作る  

キーの番号を調べれば使えるかもしれないが、ふと思いました。

キーボード配列が変わってしまったら使えなくなるのでは?

この方法では環境によっては誤動作の原因になる可能性があるのでボツ。

 

3)システムイベントでメニューのクリックしてみる  

どうやら"SystemUIServer"ではなく、"TextInputMenuAgent"にかわっているようだったので、変更した。

click menu bar item  を利用して直接に擬似クリックしてみる。

 

tell application "System Events"

tell process "TextInputMenuAgent"

click menu item "日本語" of menu 1 of menu bar item 1 of menu bar 2 --  

end tell

end tell

 

※ 右から menu bar 2(デスクトップ上部のメニュー右側) 

  menu bar item 1(メニューバー本体のアイテム) 

  menu 1(メニューバーの一つ目のメニューアイテムグループ(まぁ、一つしかないのだが...)) 

  menu item "日本語"(メニューアイテムの中の一つ) 

 となる。

 

結果は、動作しなかった。

どうやら、メニューアイテムグループを表示してからでないと反応しないらしい。

なので、追加してみた。

 

tell application "System Events"

tell process "TextInputMenuAgent"

click menu bar item 1 of menu bar 2

click menu item "日本語" of menu 1 of menu bar item 1 of menu bar 2

end tell

end tell

  

これで動作はしたのだが、何と動作が終わるまでに6秒もかかってしまった。(なぜ?)

 

4)座標でクリックしてみる  

クリックメニューバー命令が時間がかかるのか?と考え、座標を求めクリックしてみることにした。

 

tell application "System Events"

tell process "TextInputMenuAgent"

set {x, y} to position of menu bar item 1 of menu bar 2

click at {x + 8, 5}

set aList to every UI element of menu 1 of menu bar item 1 of menu bar 2

repeat with lineNo from 1 to (count of aList)

set obj to item lineNo of aList

set aName to (name of obj) as string

if aName = "日本語" then

set {x, y} to position of obj

click at {x + 50, y + 8}

exit repeat

end if

end repeat

end tell

end tell

  

これでも動作したのだが、やはり6秒もの時間がかかった。(残念!)

 メニューバーのアイコンをクリックした後に、瞬時にメニューは表示されているのだけれど、

そこで6秒間ほど動きがピタッと止まってしまう。(原因不明)

 

5)キーボードショートカットで入力ソースを切り替える方法でやってみる  

MacOS12.xではキーボードショートカット『control + スペース』で入力ソースの切り替えができる。

何だ、最初からこれでやればいいのでは? と思ったかもしれないが、じつはこのショートカットでは、切り替えた先の入力ソースが『日本語』なのか違うのかの判断ができないのです。

それを判断するためにTextInputMenuAgentのメニュー項目を読み込む必要があるのです。

入力ソースが『日本語』であるかどうかはメニューの中に日本語ソースに存在する「再変換」の項目があるかどうかで判断しています。

(中国語や韓国語など他のソースにあるかは調べていません。(すまん。)少なくとも英語には無い。)

 

tell application "System Events"

tell process "TextInputMenuAgent"

set aList to name of UI elements of menu 1 of menu bar item 1 of menu bar 2

if not ((aList as text) contains "再変換") then

key code 49 using control down

end if

end tell

end tell

   

日本語になっていなければ、key code 49 using control downを実行します。

この時、なぜkeystroke " " using control downの直接半角スペース文字を直接入力する方法を取らず、キーコードを使用したのかというと、キーストローク命令ではスペースはバグるので、使用しませんでした。(原因は不明)

※キーコードに関しては(サイト:https://eastmanreference.com/complete-list-of-applescript-key-codes)を参考にしました。

 

人によっては入力ソースが英語[ABC]と日本語ではない3つ以上の入力ソースがある人もいますが、それには対応していません。

メニューアイテムグループの内容が開かないと更新されないみたいで、それをしようとすると、魔の6秒間のフリーズが発生してしまうので、これは今後の課題とします。


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。