にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Windows用入力言語切り替えボタンを作る

概要

youtu.be

キーパッドAutoHotkeyスクリプトを組み合わせることでキーボードレイアウトを切り替える仕組みを作った。
F13-F24のキーを使用することで、キーボードの既存のキーを犠牲にすることなく実現ができた。

あいさつ

この記事は「語学・言語学・言語創作 Advent Calendar 2021」の13日目として書かれています。

語学・多言語学習畑から乱入失礼します。なんかconlang系の人が多そうですが、混乱させてしまったらすみません。


……。

はじめに

さて、多言語をかじったりしていると、いろいろな言語を入力する必要があります。
Windowsで多言語入力をするには、キーボードレイアウトを言語ごとに追加し、切り替えて入力することが多いと思います。(以下ではキーボードレイアウトは単に「キーボード」と書き、物理的なキーボードは「物理キーボード」と書いて区別することとします。)

この切り替えは言語ごとに順繰りに送っていく方式で、2~3個ならまだ切り替えるのは問題ないのですが、5個以上になってくると、目的のキーボードまで切り替えるのがかなり面倒になります。別の言語に切り替えるためにAlt+Shiftを5連打とかしないといけないのはあんまりうれしくないわけです。
ラテン文字系であれば、WinComposeなどの汎言語的に入力できるツールを使えばキーボードを切り替えなくてもよいものの、非ラテン文字の場合は使うことはできません。

そのため、キーボードを、つまり実質的には入力言語*1を切り替えることができる専用のボタンがあれば便利なのではないでしょうか。

前に検討した仕組みの問題点

私は以前にAutoHotkeyを利用してキーボードを切り替える仕組みを検討していました。

しかし、これは物理キーボードのキーを横取りしているため、使用したキーが入力できなくなってしまうという副作用が生じます。

これについては、「Windowsが認識できるが、普通のキーボードには存在しないキーコード」を出力する物理キーボード(キーパッド)を用意すれば解決します。具体的にはF13~F24というキーコードが存在していて、Windowsが認識できるようになっているので、これを使うことにしました。

キーパッド: meishi2

f:id:nixeneko:20211212200801p:plain
自分で適当なキーコードを設定できるキーパッドを用意します。キーパッドはマクロパッドとも呼ばれ、要するに「自由にキーを設定できる、キーの少ないキーボード」のことです。今回はmeishi2というキーボードキットを使いました。

キーの割当ですが、左からF13, F14, F15, F16としました。また、4言語では足りないのでは?と思い、2キーの同時押しに対してもF17~F22を割り当てています。


キーの割り当てを設定するために、QMK Firmwareをビルドして書き込むみました。

QMK Firmwareのビルドについては特に解説しませんが、次のページを参考にしています。

qmk_firmware\keyboards\meishi2\keymaps\lang_selector以下に次のキーマップのファイルをコピーし、

make meishi2:default:avrdudeとかするといいです。

AutoHotkeyスクリプト

github.com
作成したAutoHotkeyスクリプトをここに置きました。

使用準備

  1. F13-F24のキーをもつキーパッドを繋ぎます。
  2. AutoHotkey v1.1をインストールします。
  3. change_settings.ahkを起動します。
  4. 現在のキーボードを、キーに割り付けたいキーボードに変更します。
  5. キーパッドF13-F24のいずれかのキーを押します。するとそのキーに現在のキーボードが割り付けられ、その旨を示すダイアログが表示されるのでOKを押して閉じます。settings.iniが更新されます。
  6. 他にキーボードがあれば 4. に戻ります。
  7. 通知領域のAutoHotkeyのアイコンを右クリックし、Exitを選んで終了します。

キーボードの切り替え

  1. keyboard_changer.ahkを起動します。
  2. F13-F24のキーを押すと、先に設定したキーボードに切り替わります。

制限

現在は「キーボードの切り替え」であり、IMEの切り替えには対応していません。そのため、「Google日本語入力」と「Microsoft 日本語 IME」を切り替えるみたいなことができません。これはIMEはTSFという枠組みで動いているので、キーボード自体は同じものを指していて、キーボード切り替えの仕組みでは区別ができないためです。
これについてはTSF系のAPIを叩くことでなんとかできそうな気はします。

また、IMEのオン・オフを指定して切り替える仕組みも作ったのですが、利用したIME.ahkのライセンスが不明なので省いてあります。
詳しくはkeyboard_changer.ahkのソースを見てもらえばよいのですが、IME.ahkをダウンロードしてきてIME_SET関数をコピペし、関連するコメントアウトを外し、settings.iniを適切に設定すると動くようにはなります。

おわりに

多言語入力においてキーボードの切り替えが面倒だったために、Windowsに同時に設定するキーボードの数を3個程度に制限していたのですが、これで遠慮なく増やせます。現在の状態を意識しなくても目的の言語に切り替えられるのは便利です。

みなさんも素敵な多言語入力ライフをお過ごしください。

.i mi do ckire lo nu tcidu kei .i co'o rodo
.i lo lenku tcima cu ba ranji .i ko ko kurji

2021-12-13 15:45追記

こんだけ書いといてなんですが、Windowsで入力言語に対してショートカットキーが設定できました。
以前ショートカットキー設定したときは設定が反映されなかったので検討しなかったのですが、動くようになっていたのですね。

Windowsの設定→「デバイス」→「入力」→「キーボードの詳細設定」→「入力言語のホットキー」
で出てくるウィンドウで目的のキーボードに対してキーシーケンスを設定すればいいようです。

設定したキーシーケンスを出力するキーボードを用意すればAutoHotkeyスクリプト要らなかったですね。
まあショートカットキーが設定できるキーシーケンスは限られているため、ショートカットキーが被る可能性はあり、ショートカットキーの競合が少なくなるという点でAutoHotkeyを使う優位性はあるかもしれません。

*1:一つの言語に対して複数のキーボードを使うことは少ないと思ってこう書いていますが、一言語を複数の用字系で表記する場合などに同じ言語の複数のキーボードを使う必要が生じたりします。