IME がおかしくなることはときどきあるけど 以前自分で作ったものでも確実に再現するのがあったので気になったから調べてみた
一見するとおかしくなりそうなところはないので 再現するのを確認しながら色々機能を消していって ライブラリ依存はなくなって WinForms だけで発生するのを確認

どういう処理にしたら発生するかを覚えれる程度まで削ったので別 PC で 1 から同じものを作ったらなぜか再現しない
見比べても違いがわからないのでフォルダごとコピーして完全に同じソースで実行しても再現しない
ビルドした exe ファイルを持ってきても何故か発生しない
環境はどっちも Windows10 1909

再現するのに不要な部分を削る過程で 序盤は削ったら再現しなくなってたのに後半は削っても再現してたとか謎な部分もあったし確実に再現するものじゃないのかも?
だけど完全なアプリの形だと他 PC でも発生してる

一応やり方

◯ Form を 3 つと UserControl を 1 つ用意
◯ Form1 が最初に開くフォーム
◯ Form1 には TextBox と Button を配置
    ◯ Button をクリックで Form2 を開く
◯ Form2 の Load イベント時に:
    ◯ UserControl1 のインスタンスを this.Controls.Add で追加
    ◯ Form3 を開いて即閉じる
◯ Form2 の FormClosing イベント時に:
    ◯ UserControl1 を this.Controls.Remove で除外
    ◯ ↑で除外した UserControl1 の Dispose メソッド呼び出し
◯ UserControl1 は押しても反応ないボタンを一つだけ配置
◯ Form3 は機能一切なし

● 実行してテキストボックス上で IME が切り替えれることを確認
● ボタンを押して Form2 を開いたら何もせずに閉じる
● テキストボックスで IME が切り替えられなくなってる

Form2 で変なことしてるのはライブラリがやってた挙動をそのまま持ってきて再現するところだけ残したから
Dispose や Remove しなかったり Form3 を開かなかったり UserControl1 のボタンを消したりすると再現しなくなる

バージョンは .NET Framework で 3.5 や 4 や 4.6.1 など
IME はデフォルトのでも Google IME でもどっちでも

続き