2009-07-28 10 views
4

Ich habe eine Nachricht Filter registriertWie sehen Windows-Meldungen eines Dialogs mit einem zweiten Thread?

Application.AddMessageFilter(m_messageFilter); 

mit mit diesem ich alle der Maus anmelden können klickt ein Benutzer in der Benutzeroberfläche der Anwendung macht.

ist jedoch ein Dialog auf einem separaten Thread, mit dem Code so etwas wie laufen:

void Run() 
{ 
    using(MyDialog dialog = new MyDialog()) 
    { 
     dialog.ShowDialog(); 
    } 
} 

Thread thread = new Thread(Run); 

Der Nachrichtenfilter wir einrichten keine Nachrichten zu sehen, die zu diesem Fenster gehen. Wie kann ich sie bekommen (idealerweise ohne zu aufdringlich zu sein)?

Ich habe versucht, MyDialog.PreProcessMessage zu überschreiben, aber ich bin verwirrt, dass dies scheint nie aufgerufen werden.

Danke.

Antwort

2

So ziemlich alle Anwendungsmethoden, einschließlich AddMessageFilter, sind Thread-spezifisch. Also, wenn Sie die Nachrichten auf dem anderen Thread filtern möchten, müssen Sie AddMessageFilter für diesen Thread aufrufen.

Sie Ihre Run-Methode ändern:

void Run() 
{ 
    using(MyDialog dialog = new MyDialog()) 
    { 
     Application.AddMessageFilter(new MyMessageFilter()); 
     Application.Run(dialog); 
    } 
} 
1

Nur ein Stich, aber Sie können das Schlüsselwort volatile nutzen, hier ist ein Beispiel für using a volatile bool to check state between processes on different threads.

Sie könnten diese Methode wahrscheinlich an Ihre Bedürfnisse anpassen. Flip es je nachdem, ob die msg auf dem zweiten Dialog

{EDIT} in Bezug auf die PreProcessMessage, glaube ich, dass nur für Tastatureingabe, nicht Maus ist. Wahrscheinlich müssen Sie WndProc überschreiben, um diese Ereignisse zu erhalten. Das ist wahrscheinlich der Grund, warum die überschriebene PreProcessMessage nicht ausgelöst wird.

Viel Glück!

+0

Wie volatil wird hilfreich sein, hier oder auch relevant?Offensichtlich besteht das Problem darin, dass es zwei separate Nachrichtenpumpen gibt (Haupt-UI-Thread und zweiter UI-Thread) und der Filter nur zum Haupt-UI-Thread hinzugefügt wird und die Nachrichten im zweiten Thread zur Nachrichtenpumpe dieses Thread, die keine hat Filter. –

1

Ich nehme an, Sie Ihren Code auf folgende Weise

void Run() 
{ 
    using(MyDialog dialog = new MyDialog()) 
    { 
     Application.Run(); 
     dialog.ShowDialog(); 
    } 
} 

umschreiben sollte oder

Application.Run(dialog); 

innen mit sein kann {...} wird auch

Application.Run arbeiten () beginnt mit dem Ausführen einer Standard-Anwendungsnachrichtenschleife auf dem aktuellen-Thread. Normalerweise funktioniert die Nachrichtenschleife nur im Hauptthread. Ohne Application.Run() Standard-Nachrichtenschleife wird nicht im zweiten Thread gestartet.

Hier ist ein Artikel Creating a Splash Screen Form on a Separate Thread wo ähnliche Technik verwendet wurde - zweite Form (SlpashScreen) wird in einem anderen Thread gestartet und sie rufen Application.Run (Splash); in diesem zweiten Thread.

Wie aus diesem Artikel hervorgeht, erfordert das Ausführen von Formularen in verschiedenen Threads von einem Entwickler sehr vorsichtig zu sein, wie Sie Formulare schließen/löschen.

Verwandte Themen