チャットの誤送信を撲滅するツール
はじめに
表題のものを作ったので、主にロジック部分の実装について書き残しておきます。ソースコードはこの記事には貼らないので、適宜GitHubリポジトリを参照してください。成果物(exeファイルの入ったzipファイル)はReleaseページからダウンロードできます。
作った動機
人間あるいはAI相手にチャットを入力しているとき、不意にEnterキーを押してしまって文の途中で誤送信すること、ありますよね(小林製薬)。
我々が等しく思い描いている挙動は、おそらくこうです。
| 操作 | 理想 | 現実 |
|---|---|---|
| 変換を確定 | Enter | Enter |
| 改行 | Enter | Shift + Enter |
| 送信 | Ctrl + Enter | Enter |
Teams v2には理想の挙動がオプションとして用意されたにも関わらず、同じくMicrosoft製のM365 Copilotには何故か用意されていません。他にはDiscordやCopilot等も軒並み「現実」なので、デスクトップ/Web問わず全部まとめて理想の挙動になるべきです。
同じ目的を持ったプロジェクトはいくつか試しましたが、満足に動作するものに出会えなかったので自力で何とかすることにしました。
環境
OS
- Windows 11 [1]
入力メソッド
- Microsoft IME
- ❌ Google日本語入力
- ❓ ATOK
方針
単純にキーバインドを次のように置き換えても、我々が日本語を使う限りはうまくいきません。
Enter→Ctrl+EnterShift+Enter→Enter
- この状態でIMEをONにして日本語をタイプする
- 皆さんもご存知の通り、タイプされた文字には下線が引かれて未確定な状態になる
Shift+Enterでは未確定な文字を確定できないので、Enterキーが実質的に無効化される- 仕方がないので、本来の
Enterを求めて送信用のCtrl+Enterを恐る恐る押して確定する
これでは今までと何も変わりません。つまりは、「変換を確定」するときだけはEnterキーはそのままEnterとして機能する必要があります。これを含めて所望の機能を実現するためには、以下の2点を常に監視できればよいです。
- IMEがONかOFFか
- 未確定な文字の有無
検索すると以下の記事が割とすぐヒットします。上記2点を達成するためのスニペットが記載されているのですが、残念ながらそのままではうまく動作しなかったので改良していきます。
実装
IMEがONかOFFかを取得する
これは先の記事のIME_GET()を使えばよいのですが、WebView2で描画されているデスクトップアプリ(Teams v2、M365 Copilot、…)に対応していません。そこで、そのような場合にはUIAutomation(UIA)ライブラリを用いることにしました[2]。統合後の関数をIsIme()と名付けて、リポジトリのsrc/IME.ahk内に記述しました。
未確定な文字の有無を取得する
同じく先の記事のIME_GetConverting()を使えれば良かったのですが、これは少なくとも私の環境では上手く動作しませんでした。そこで少し考えてみて、未確定な文字の有無 == IS_IME() && 直前に文字が打たれたかどうかであることに気付きました。
条件分岐を捏ねて捏ねて、一連の処理をEnterController.ahk内に記述しました。
おわりに
ソースコードを示さず長々と解説しても何のこっちゃという感じですが、こういうものを書き残しておくとたまに未来の自分が救われたりするので良しとします。
贔屓目を抜きにしても結構よくできたツールだと思うので、良かったら使ってみてください。

