/ / Woher wissen Sie, wann ein Meldungsfeld für ein Formular angezeigt wurde? - c #, Formulare

Wie kann man wissen, wenn eine Message Box hat eine Form gezeigt? - c #, Formen

In meiner Anwendung habe ich eine Aufgabe, die in einem Hintergrundthread ausgeführt wird. Ich brauche eine Benachrichtigung im Hintergrundthread, wenn im UI-Thread eine MessageBox oder ein modaler Dialog angezeigt wird.

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

Für z.B.

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

Ich vermute, da könnte ich eine Nachricht haben, an die ich mich anschließen kann. Gibt es selbst im Haupt-GUI-Thread Nachrichten oder Ereignisse, die ausgelöst werden, bevor ein modaler Dialog angezeigt wird?

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

Alles funktioniert gut, bis auf eineGlitch - 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 eine Möglichkeit, um benachrichtigt zu werden, dass ein modales Dialogfeld angezeigt wurde, und ich sollte den Fortschrittsdialog ausblenden.

Im Moment muss ich es explizit kurz vor jedem Aufruf von MessageBox ausblenden.

Ich hoffe das erklärt.

Antworten:

5 für die Antwort № 1

Richten Sie ein CBT-Haken. Sie erhalten dann eine Benachrichtigung über alle erstellten, aktivierten, deaktivierten und zerstörten Fenster. Anschließend können Sie mit GetWindowClass prüfen, ob es sich bei dem erstellten hWnd tatsächlich um eine MessageBox handelt.


2 für die Antwort № 2

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


0 für die Antwort № 3

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

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

Das könnte auch für Sie funktionieren ...

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

Und pass auf MB_TOPMOST als der Typ.