IME on/off の切換 - その4
macos の入力ソースの切換プログラミングでは、kTISPropertyInputSourceIsSelected プロパティや selectedKeyboardInputSource で、現在の入力ソースを調べることができる。プログラムのロジックとしては、これを使って、現在のソースと違うソースが要求されたときだけ、ソース切換処理をするというふうにしたいところである。
しかし、ここには大きな落とし穴があった。実はこの変数は、プロセス起動時点の入力ソースは取れるもの、その後はプロセス内で処理した値しか取れないのであった。つまり、例えば手動で入力ソースを切り替えてしまうと、切換後の入力ソースをプログラム側で検知することはできない。色々調べてみたが、APIを通じてリアルタイムに、かつ確実に現在のソースを取得する術は見当たらなかった。
何かいい方法はないかと考えていたとき、ふと「APIが頼れないなら、表示されている情報を直接読み取ればいいのでは」と思いついた。メニューバーの右端には、常に現在の入力ソース名が表示されているではないか。
そこで、Swift で作っていた TISServer を改造して、メニューバーの表示を利用した判定ロジックを組み込んでみた。原理はシンプルで、メニューバーの入力ソース表示領域をスクリーンキャプチャしで、OCR機能でテキストに変換することで現在のソースを特定するという、いかにもシロウトが考えそうな方法である。ChatGPT に聞いてみたところ、Swift ではスクリーンキャプチャも OCR も標準でできるようになっていて、使い方も教えてくれた。
早速プログラミングしてみたが、キャプチャからOCR完了までにかかる時間は100ミリ秒程度、実用的な速度ではある。執念でプログラムしてみたものの、一体そこまでこだわらなくても、いいのかもしれないと、思いそうになった。


