複数のフォームを持つ大規模なアプリケーションで、WinForms を使用して C# で作業しています。
いくつかの時点で、進行状況画面として別のフォームが表示されます。UI スレッドをフリーズできないため、新しいフォームを新しいスレッドで開始する必要があります。フォームの起動に使っprogressform.ShowDialog()
ていますが、新規スレッドなので、クリックAlt + Tab
でメインフォームに戻ることができます。これを無効にしたい。
私の考えでは、mainForm.GotFocus
イベントに EventHandler を配置し、表示されている場合はフォーカスをリダイレクトできprogressForm
ます。ただし、GotFocus
アプリケーションを切り替えたり、 と の間を移動したりしてもprogressForm
、イベントはトリガーされませんmainForm
。mainForm
フォーム自体ではなく、一部の要素にフォーカスがあるためだと思います。
これを行うためのより良い方法を誰かが知っている場合 (私は EventHandler アプローチにコミットしていません)、または EventHandler アプローチの作業コードを知っていれば、問題は解決します。
編集
コメントの通り、Activated
イベントを使ってみました。
// in InitializeForm()
this.Activated += FocusHandler;
// outside of InitializeForm()
void FocusHandler(object sender, EventArgs e)
{
if (ProgressForm != null)
{
ProgressForm.Focus();
}
}
それでも、クリックしてメイン フォームに戻り、ボタンをクリックすることはできました。