筆者は長年、親指シフト入力を愛用しており、ここしばらくは、Windowsでは紅皿、MacではLacailleを愛用していました。
しかしながら、2026年2月頃の Windows版 Teams のアップデートにより、紅皿からの親指シフト入力が壊れてしまう事象が発生、その後も直らなくなりました。
他のソフトはもちろん正常で、なぜか Web版Teams でも問題ありません。
- Windows版 Teams 新GUI: NG
- Teams Web版: OK
- Chromeブラウザ: OK
- 秀丸エディタ: OK
という状態で、かなり途方に暮れていました。
そこで、ついに重たい腰を上げて、親指シフトエミュレータを自作し、解決に至りました。
なお、エミュレータ自作といっても、Keyhac という Windows/Mac 両対応のキーボードカスタマイズツールを使い、その設定(config.py)を Python で書いているだけです。
しかも実装の大部分は、Codex くんに書いてもらいました。
結果として、ほぼ1日で、Windows / macOS 両対応で、もちろん Windows版 Teams 新GUI でも正常動作し、これ一本で快適な親指シフト環境を復活させることができました。
完成したリポジトリはこちらです。
この記事では、
- なぜ既存の親指シフトエミュレータが Teams で壊れるのか
- なぜ Web版Teams は平気なのか
- なぜ JISかな入力 で安定したのか
- JISかな入力で問題になる「上段数字・記号」をどう解決したか
- mac/win両対応 config をどう作ったか
について整理します。
同じ症状で困っている人の参考になれば幸いです。
なお、ソースコード冒頭の
USE_UNIFIED_JIS_KANAをFalseにすると、ローマ字かな変換で動作します。Teamsで親指シフトが壊れることに悩んでいない場合は、そちらの設定の方が良いと思います。変なハックが入っていないため安定感があります。
1. Keyhacの概要
1.1. Keyhacの入手とインストール
KeyhacはこちらからWindows版、Mac版ともに入手可能です。
なお、Mac版は別途、GUI版のPython3.12のインストールが必要でしたが、Windows版はランタイムが同梱されていました。
1.2. Pythonによる親指シフトエミュレータの作成
ベース実装としては、NeoCat さんの keyhacを使ってNICOLA配列(ローマ字入力設定用)にするためのconfig例を参考にしました。
Windows/Mac 両対応とするため、環境を判断して、英数・無変換・変換の物理キーの割り当てを変更できるような設計にしました。
ただし今回は、ローマ字変換前提の部分を、JISかな変換前提に変更することが、本質的なポイントになります。
2. なぜ既存のエミュレータはTeamsで壊れるのか
2.1. WebView2の特殊性
まず前提として、新しい Microsoft Teams クライアントは Microsoft Edge WebView2 を利用しています。Microsoft公式ドキュメント には、「最新版の Microsoft Edge WebView2 を使用している」と説明されています。
また WebView2 / Chromium 系入力では、MDN のイベント解説 にあるように、beforeinput は / だけでなく contenteditable 要素でも発火し、Webアプリケーション側が入力途中のイベントを処理できます。
つまり Teams 新GUIでは、IMEの最終結果だけでなく、その前段の keydown / beforeinput / composition といったイベント列が、WebView2 / Chromium / Teams側のリッチテキストエディタに観測されうる、ということになります。
2.2. 犯人はローマ字変換
通常の親指シフトエミュレータは、
W単独打鍵
↓
か
↓
内部では "ka" を送出
のように、ローマ字変換を前提として動作しています。
通常のアプリケーションでは、これで特に問題ありません。
しかし Teams 新GUIでは、この "ka" というローマ字列が、WebView2 / IME 境界で壊れます。
特に不思議なのは、
k
a
というローマ字列が、単独の "k"・"a" としてJISかな解釈され、
k → の
a → ち
のような出力になってしまうことです。
つまり、IMEの最終結果だけではなく、その途中段階の状態が、Teams / WebView2 側にかなり露出し、なおかつ、ローマ字列が、JISかな入力として解釈されてしまっているように見えます。
3. JISかな入力対応の親指シフトエミュレータの難しさ
3.1. かな変換は比較的簡単
なぜこのような動作になってしまうのかは完全解明できていません。しかしながら、現象をありのままに受け入れ、ローマ字入力ではなく、JISかな入力を前提とした親指シフトエミュレータを開発すれば、解決するのでは?と考えました。
つまり、
W単独打鍵 → k + a
ではなく、
W単独打鍵 → [か]のJISかなキーである t
を送ることにします。IMEの入力方式は、JISかな入力に固定します。
結果は、見事、Teams 新GUIを含むすべての環境で、安定した変換ができるようになりました。
3.2. 上段数字・記号は難関
しかし JISかな入力には別問題があります。
JISかな入力では、
Shift + 2
などの「上段数字・記号」について、
ASCII記号をそのまま出力するための単純なキー対応が存在しません。
ちまたの親指シフトエミュレータは、JISかな入力に対応していないわけです。
これに対していろいろ試行錯誤し、最終的には、
- 通常かな → JISかな変換
- ASCII記号 → 一時的に英数モードへ切替て変換(というか、そのまま出す)
というハイブリッド構成にすることで、乗り切りました。
4. Codexの力
今回かなり驚いたのは、ここまでのエミュレータが、Codexを利用したことで、ほぼ1日で完成してしまったことです。
もちろん、かなり泥臭いデバッグは必要でした。
しかし、
- config のほとんどの部分の生成
- 状態機械の整理
- OS差異吸収
- 最後の一時的な英数モード変換のアイデア
などは、Codex にかなり助けられました。
また、Codexを前提とすると、Keyhac特有の、Pythonにより挙動を自由に変更できるという特性が、とても生かされたと思います。
なかなか、面白い時代になったものです。