標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Google IME を使ってると、Windows Terminal が起動時に IME が有効になって困る件

twitter で見た回避策

なるほど、Windows Terminal の時だけ、MS-IME を使用するようにするわけですか

Windows 11 の場合に選択すべきメニュー場所がちょっと違うようなので、メモ

  1. 1. 言語と地域設定から、Google 日本語入力、Microsoft IMEを両方有効化」が見付からなかったが、設定せずとも 2. 以降だけで一応 OK だった(自分の環境だけ?)
  2. 設定
    → 時刻と言語
    → 入力
    → キーボードの詳細設定
    → アプリウインドウごとに異なる入力方式を設定する
  3. WindowsTerminal 上で、Windowsキー + SPACE を押下して、MS-IME を選択 (SPACEでトグル)
  4. ブラウザなどのテキストエリアで同様に、Google-IME を選択

ただ、これタブを増やす時は大丈夫ですが、新規に WindowsTerminal を起動する時は、都度 Windowsキー + SPACE がいるんですよね…

別解の検討

自分は WindowsTerminal 上での日本語入力はすべてアプリ側組み込みの SKK を使ってるので、いっそ、WindowsTerimnal では IME を常時オフがのぞましかったんですが… 残念ながら Null-IME 的なものは巷にはないようです。

他のアプローチなども考えていて、WindowsTerminal が起動した時に IME をオフするようなコマンドを発行できないかなと、WindowsAPI をググったりしてみたのですが

1案

(APIの呼び出しのイメージ)

Imc := ImmGetContext( ウインドウハンドル )
ImmSetOpenStatus(himc , false )
ImmReleaseContext( hwnd , himc )

このウインドウハンドルを取得の仕方がたいへんそうなので、頓挫中。

これ、普通のコンソールウインドウであれば、 go-windows-consoleicon でやっているように GetConsoleWindow で得られるんですが、WindowsTerminal の場合、コンソールアプリ側から見えるコンソールウインドウは多分隠しウインドウで、実際に表示されているウインドウとは異るはずなので使えない。

あとのアプローチとしては考えたのは EnumWindows 関数で全てのウインドウハンドルを列挙して、全部に対して上を実行するという方法。無茶だなぁ

2案

WriteConsoleInputW 経由で、キーボードイベントとして VK_IME_OFF など IME のオフにするようなスキャンコードを送り込むという方式ですが…これも現状うまくゆかず。 ( おそらく1案と同様、アプリから見えるコンソールと表示されるコンソールが異なるせいではないかと )