⌨️

Macでキーボード配列を瞬時に変更する(2022年1月Monterey対応)

2022/01/28に公開

MacBookのキーボードはJIS配列だけど、外付けキーボードはUS配列という場合に、使用するキーボードを変える時はキーボード配列の変更作業が必要です。

ですがそれを自動的に行えるコマンドなどはなく、いちいち手動でキーボード設定を開いてポチポチしなければいけません。

で、それを自動でやってくれるAppleScriptが以下の記事で書いてあり、とても便利そうだったのですが。2022年1月現在、MacOS 12 Montereyではエラーが発生して動きませんでした。

https://kyogom.com/tech/ansi-to-jis/

そこで、Montereyでも動作するAppleScriptを新たに書きましたので、ご自由にお使いください!

クイックアクションの登録方法などは上記リンク先の記事を参照してください。

JIS配列に変更

set keyboard to "JIS"

tell application "System Preferences"
	quit
	activate
	set current pane to pane "com.apple.preference.keyboard"
	delay 1
end tell

tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "キーボード"
			click button "キーボードの種類を変更…"
			delay 1
		end tell
	end tell

	tell process "KeyboardSetupAssistant"
		tell window "キーボード設定アシスタント"
			click button "続ける"
			tell application "System Events" to keystroke "z" using command down
			delay 0.5
		end tell

		click button "スキップ" of window 1
		delay 0.5

		tell window "キーボード設定アシスタント"
			tell scroll area 1
				set ui to value of every static text
				repeat with i from 1 to count of ui
					if item i of ui contains keyboard then
						click radio button (i / 2)
						exit repeat
					end if
				end repeat
			end tell
			click button "完了"
		end tell
	end tell
end tell

tell application "System Preferences"
	quit
end tell

ANSI配列に変更

※上記スクリプトの一行目を "ANSI" に変更しただけです。

set keyboard to "ANSI"

tell application "System Preferences"
	quit
	activate
	set current pane to pane "com.apple.preference.keyboard"
	delay 1
end tell

tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "キーボード"
			click button "キーボードの種類を変更…"
			delay 1
		end tell
	end tell

	tell process "KeyboardSetupAssistant"
		tell window "キーボード設定アシスタント"
			click button "続ける"
			tell application "System Events" to keystroke "z" using command down
			delay 0.5
		end tell

		click button "スキップ" of window 1
		delay 0.5

		tell window "キーボード設定アシスタント"
			tell scroll area 1
				set ui to value of every static text
				repeat with i from 1 to count of ui
					if item i of ui contains keyboard then
						click radio button (i / 2)
						exit repeat
					end if
				end repeat
			end tell
			click button "完了"
		end tell
	end tell
end tell

tell application "System Preferences"
	quit
end tell

どうやって作ったの?

AppleScriptでは、every UI element を使うことで、指定したwindowやwindow内のUIの中にあるUI要素を調べることができます。

基本的にはこれを操作したいwindowで実行して、UIの名前を特定したら今度はそのUIの中でまた実行して、…を繰り返して目的のUIを探します。

tell application "System Events"
  tell process "KeyboardSetupAssistant"
    tell window "キーボード設定アシスタント"
      tell scroll area 1
        every UI element
      end tell
    end tell
  end tell
end tell

これを(キーボード設定アシスタントの最後の画面を開いた状態で)スクリプトエディタ上で実行すると、以下の出力が得られます。

{static text "キーボードの種類が分からない場合は、お使いのキーボードの製造元に問い合わせて、種類を確認してください。" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", radio button 1 of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "ANSI(米国、アジアのほぼ全域、その他)" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "標準的な101キーまたは102キーのキーボード、およびその他いくつかのキーボード" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", radio button 2 of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "ISO(ヨーロッパ、ラテンアメリカ、中東、その他)" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "ISO/IEC 9995規格のキーボード" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", radio button 3 of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "JIS(日本語)" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events", static text "入力プログラムキーが付いた標準的な日本語キーボード" of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events"}

かなり読みづらいですが、 of scroll area 1 of window "キーボード設定アシスタント" of application process "KeyboardSetupAssistant" of application "System Events" という文字列全て消して整理してあげると、以下のようになります。

{
  static text "キーボードの種類が分からない場合は、お使いのキーボードの製造元に問い合わせて、種類を確認してください。" ,
  radio button 1 ,
  static text "ANSI(米国、アジアのほぼ全域、その他)" ,
  static text "標準的な101キーまたは102キーのキーボード、およびその他いくつかのキーボード" ,
  radio button 2 ,
  static text "ISO(ヨーロッパ、ラテンアメリカ、中東、その他)" ,
  static text "ISO/IEC 9995規格のキーボード" ,
  radio button 3 ,
  static text "JIS(日本語)" ,
  static text "入力プログラムキーが付いた標準的な日本語キーボード"
}

これでどんなUIが操作可能かわかるようになりました!

あとは

tell application "System Events"
  tell process "KeyboardSetupAssistant"
    tell window "キーボード設定アシスタント"
      tell scroll area 1
        click radio button 1
      end tell
    end tell
  end tell
end tell

のように呼ぶとUIを自動的にクリックさせることができます。

ただし今回のキーボード設定アシスタントでは、クリックしたいラジオボタンの位置が、状況によって毎回変わってしまいます(例えば、JISが一番上に来ることもあれば一番下に来ることもある)。

そこで上記スクリプトではまず「JIS」が含まれるstatic textを探して、そのインデックスをもとにクリックするべきラジオボタンの位置を計算しています。

追記:アクセシビリティ設定

クイックアクションから実行するときは初回実行時にエラーが出ます。セキュリティとプライバシーの設定のアクセシビリティで「ServiceUIAgent」が自動的に追加されるので許可しておいてください。

「スクリプトエディタ」や「Automator」も併せて許可しておくと良いと思います。

アクセシビリティ

Discussion