2009-05-28 14 views
2

私のアプリケーションでは、バックグラウンドスレッドで実行されているタスクがあります。 MessageBoxまたは任意のモーダルダイアログがUIスレッドに表示されるときに、バックグラウンドスレッドで通知が必要です。フォームのメッセージボックスがいつ表示されたかを知るには?

私はMessageBoxを表示する前にいくつかの関数を呼び出すことによって手動で行うことができますが、必要がなければ素晴らしいことになります。例えばのために

backgroundThread.MessageShown(); // I do not want to call this explicitly every time! 
MessageBox.Show("Task halted!"); 

私は可能性が私にそこに引っ掛けることができ、いくつかのメッセージを推測しています。メインのGUIスレッドでも、モーダルダイアログが表示される直前に発生するメッセージ/イベントはありますか?

これは必須です。 UIスレッドで実行されるいくつかのタスクがあり、別のダイアログで進行状況を表示する必要があります。これはワーカースレッドに表示されています。私はそれがワーカースレッドで行われなければならないタスクでなければならないことを理解していますが、現在のシナリオは当面は変更できません。

すべてのことがうまくいきます。ただし、メッセージボックスがUIスレッドに表示されている場合は、進行状況ダイアログの下に表示されません。したがって、ユーザーはUIが入力を待っていることを知ることはありません。私は、モーダルダイアログボックスが表示されていることを通知する方法が必要です、そして、私は進捗ダイアログを隠すべきです。

今は、MessageBoxを呼び出す直前に明示的に非表示にする必要があります。

私はそれが説明されることを願っています。

+0

これはうまくいかないかもしれませんが、なぜあなたのバックグラウンドスレッドはUIの状態を知る必要がありますか? –

+0

@Damien_The_Unbeliever:バックグラウンドスレッドはUIスレッドでもあるため、フォアグラウンドUIスレッドに従って動作する必要があります。 – nullDev

答えて

5

CBT Hookを設定します。次に、作成、起動、無効化、破棄されたすべてのウィンドウを通知します。次に、GetWindowClassを使用して、作成/アクティブ化されたhWndが実際にMessageBoxであるかどうかを確認します。

+0

ありがとうdanbystrom、これは私が探していたものです! – nullDev

+0

うれしい私は助けることができました! +100をありがとう。 :-) –

2

Showを呼び出すときにイベントを発生させる独自のメッセージボックスを作成しますか?

+0

もう少し詳しい情報:私は既存のアプリケーションでこれを使用しますので、すべての呼び出しを変更して変更するのはひどいでしょう! さらに、私が言ったように、_any_モーダルダイアログの通知が必要です。 – nullDev

+0

あなたが呼び出すラッパーの何か: MBWrapper(MB_OK、 "text"); MBWrapperはイベントを発生させ、MessageBox.Showを呼び出します。 – RvdK

0

MessageBoxの親がTopMostの場合、MessageBoxはTopMostになります。だから、何かのような...

MessageBox.Show(new Form() { TopMost = true }, "Message and so forth ..."); 

これも

DllImport("user32.dll")] 
public static extern int MessageBox(int hWnd, String text, String caption, uint type); 

...あなたのために働くとタイプとしてMB_TOPMOSTを渡すかもしれません。

関連する問題