2009-05-28 6 views
2

In meiner Anwendung habe ich eine Aufgabe, die auf einem Hintergrundthread ausgeführt wird. Ich benötige eine Benachrichtigung im Hintergrund-Thread, wenn eine MessageBox oder ein modales Dialogfeld im UI-Thread angezeigt wird.Wie kann man wissen, wann eine Message Box für ein Formular angezeigt wurde?

Obwohl ich es manuell tun kann, indem ich eine Funktion vor dem Anzeigen der MessageBox, aber es wird großartig sein, wenn ich nicht muss.

Für z.B .:

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

Ich vermute, es könnte mir eine Botschaft, die auf angeschlossen werden kann. Gibt es auch im Haupt-GUI-Thread eine Meldung/ein Ereignis, die kurz vor dem Anzeigen eines modalen Dialogfelds ausgelöst werden?

Okay, hier ist die Anforderung. Ich habe einige Aufgaben, die im UI-Thread ausgeführt werden, und ich muss den Fortschritt in einem separaten Dialogfeld anzeigen, das in einem Arbeitsthread angezeigt wird. Ich verstehe, dass dies die Aufgaben sein sollten, die im Worker-Thread erledigt werden müssen, aber das aktuelle Szenario kann vorläufig nicht geändert werden.

Alles funktioniert gut, bis auf einen Fehler: Wenn im UI-Thread ein Meldungsfeld angezeigt wird, wird es unter dem Fortschrittsdialogfeld ausgeblendet. So erfährt der Benutzer nie, dass die Benutzeroberfläche auf eine Eingabe wartet. Ich brauche einen Weg, um benachrichtigt zu werden, dass ein modales Dialogfeld angezeigt wurde und ich den Fortschrittsdialog ausblenden sollte.

Jetzt muss ich es direkt vor jedem Aufruf von MessageBox explizit ausblenden.

Ich hoffe, dass erklärt.

+0

Dies ist möglicherweise nicht gut, aber * warum * muss Ihr Hintergrund-Thread über den Zustand der Benutzeroberfläche wissen? –

+0

@Damien_The_Unbeliever: Weil der Hintergrund-Thread auch ein UI-Thread ist, der entsprechend dem Vordergrund-UI-Thread handeln muss! – nullDev

Antwort

5

Richten Sie eine CBT Hook ein. Dann erhalten Sie eine Benachrichtigung über alle erstellten, aktivierten, deaktivierten und zerstörten Fenster. Verwenden Sie dann GetWindowClass, um zu prüfen, ob die erzeugte/aktivierte hWnd tatsächlich eine MessageBox ist.

+0

Danke danbystrom, das ist genau das, was ich gesucht habe! – nullDev

+0

Ich bin froh, dass ich helfen konnte! Danke für die +100. :-) –

2

Erstellen Sie Ihre eigene Messagebox, die beim Aufruf von Show ein Ereignis auslöst?

+0

Okay, ein wenig mehr Informationen: Ich werde dies in einer bestehenden Anwendung verwenden, so dass es schrecklich sein wird, herumzugehen und jeden Anruf zu ändern! Und weiter, wie ich schon sagte, ich möchte die Benachrichtigung für _any_ modalen Dialog. – nullDev

+0

Hmm irgendwas von Wrapper, die Sie anrufen: MBWrapper (MB_OK, "Text"); MBWrapper wird das Ereignis auslösen und MessageBox.Show aufrufen – RvdK

0

Wenn das übergeordnete Element Ihrer MessageBox TopMost ist, ist Ihre MessageBox TopMost. Also, so etwas wie ...

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

Dies könnte auch für Sie arbeiten ...

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

Und MB_TOPMOST als Typ übergeben.

Verwandte Themen