この記事のコードを使用して、アプリがアイドル状態になったことを通知しようとしています。
このコードは、アプリケーションにフォームが1つしかない場合にうまく機能します。これを呼び出すApplication2.Run(myOnlyForm)
と、すべてのメッセージがApplication2のフィルターを介してルーティングされます。
ただし、いずれかの時点でmySecondForm.ShowDialog()
そのダイアログを呼び出しても、そのメッセージはApplication2でフィルタリングされません。
mySecondForm
メッセージを「Application2」イベントフィルターに通す方法はありますか(悪い副作用はありません) ?
私が試してみました:
- に変更
mySecondForm.ShowDialog
しApplication2.Run(mySecondForm)
ます。- これにより、ウィンドウがスコープ外になったときにクリーンアップされず、必要なときに表示されなくなります。
- に変更
mySecondForm.ShowDialog
しApplication2.ShowDialog(mySecondForm)
ます。 - (true =ダイアログボックスをクリーンアップする)
に変更
mySecondForm.ShowDialog
します。Application2.ShowDialog(mySecondForm, true)
- 何度か閉じた後にダイアログボックスにアクセスする必要があるため、これは機能しません。
理想的には、Application2のメッセージ機能にフォームを添付する方法が必要です。
しかし、私はどんな提案も歓迎します。
編集:ctackeの提案に基づいて、これは私が行ったことです:
public static DialogResult ShowDialog2(this Form form)
{
//form.Activated += InsertMenu;
//Application2.ShowDialog(form);
form.Show();
try
{
do
{
Application2.DoEvents();
} while (form.Visible);
}
catch (ObjectDisposedException)
{
// This just means that the form was closed. Not a big deal.
}
return form.DialogResult;
}
ShowDialogではなくShowDialog2を呼び出すことになります