複数のフォームを持つ大規模なアプリケーションで、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();
}
}
それでも、クリックしてメイン フォームに戻り、ボタンをクリックすることはできました。