◆ Windows Forms である処理をすると IME が効かなくなる問題がある
◆ .NET5 で試してみたけど発生してる

.NET 5 の WinForms を使うことがあったので 以前のこれが直ってたりしないかなと思って試してみました

どんな現象?

簡単に説明すると

起動すると開くウィンドウにボタンがあって 押すとウィンドウが開きます
このウィンドウにもボタンがあって ボタンを押すとまたウィンドウが開きます
このタイミングで一番最初からあるウィンドウが背面に回ります

そして 開いた 2 つのウィンドウを閉じて最初からあるウィンドウをアクティブにします
そのウィンドウにあるテキストボックスで IME を有効にしようとすると IME が有効にできないというものです
ウィンドウを開く前の起動直後だと問題なく有効にできています

試してみたら

再現しました

バグも含めてちゃんと移植されてるんですね……

ランタイムバージョンは 5.0.6 でした

もう少しシンプル化できた

この現象に気づいたアプリケーションは結構複雑なものだったので 前回の状態まで削るので体力を使い果たしていたのですが 今は余裕があるのでもう少しシンプルに削れないかを試してみるともう少し簡単なものにできました

コード的にはこういうものになりました

Form1

作成後にデザイナからボタンを一つ配置して ボタンのクリック時に Form2 を開くようにします

private void button1_Click(object sender, EventArgs e)
{
new Form2().Show();
}

Form2

作成後にコンストラクタを次のように変更します

public Form2()
{
InitializeComponent();

var control = new UserControl1();
this.Controls.Add(control);

this.FormClosing += (sender, e) =>
{
this.Controls.Remove(control);
control.Dispose();
};
}

Form3

作成後にコンストラクタを次のように変更します

public Form3()
{
InitializeComponent();

this.Load += (sender, e) =>
{
var form = new Form4();
form.Show();
form.Close();
};
}

Form4

作成するだけで何も変更しません

UserControl1

作成後にデザイナからボタンを追加して ボタンのクリック時に Form3 をダイアログとして開くようにします

private void button1_Click(object sender, EventArgs e)
{
new Form3().ShowDialog();
}

変更点

Form3 がシンプルになって UserControl2 はなくなりました
Form2 も panel や Form4 を開いて閉じる処理がなくなりました

削れないところ

Form3 を開いたときに Form4 を Show/Close する処理をなくすと ウィンドウが背面に移動する現象が起きなくなり IME は普通に動作します

Form2 の FormClosing の処理をなくすと ウィンドウは背面に移動しますが IME は普通に動作します

Form2 の UserControl をなくして直接 Button を配置すると ウィンドウは背面に移動しますが IME は普通に動作します

ダイアログとして開いたフォーム (Form3) から通常のフォーム (Form4) を開く処理があるとウィンドウが背面に移動して ウィンドウが背面にある状態で FormClosing の処理があると IME が使えなくなるようです