Prüfung eine Message Queue

Gelegentlich muss eine Anwendung den Inhalt der Meldungswarteschlange eines Threads von außerhalb die Meldungsschleife des Threads untersuchen. Beispielsweise wenn eine Anwendung Fensterprozedur eine langwierige Zeichnung Operation ausführt, können Sie den Benutzer den Vorgang unterbrechen kann. Sofern Ihre Anwendung die Nachrichtenwarteschlange in regelmäßigen Abständen während der Operation für Maus-und Tastaturmeldungen untersucht wird, reagiert es nicht auf Benutzereingabe bis, nachdem der Vorgang abgeschlossen ist. Der Grund dafür ist, dass die DispatchMessage -Funktion in die Meldungsschleife des Threads nicht zurückgibt, bis die Fensterprozedur beendet Verarbeitung einer Nachricht.

Die PeekMessage -Funktion können Sie eine Warteschlange während eines längeren Vorgangs prüfen. PeekMessage ähnelt die GetMessage -Funktion; sowohl Überprüfen einer Warteschlange für eine Nachricht, die den Filterkriterien entspricht, und kopieren Sie dann die Nachricht in eine MSG -Struktur. Der Hauptunterschied zwischen den beiden Funktionen ist, dass GetMessage nicht wieder bis eine Meldung, die den Filter Kriterien in die Warteschlange gestellt wird während PeekMessage wird sofort zurückgegeben, unabhängig davon, ob eine Nachricht in der Warteschlange.

Im folgenden Beispiel wird veranschaulicht, wie PeekMessage mithilfe eine Nachrichtenwarteschlange für Mausklicks und Tastatureingaben während eines längeren Vorgangs prüfen.

HWND Hwnd; 
BOOL fDone; 
MSG msg; 
 
/ / Starten die Operation und weiter, bis es abgeschlossen ist / / oder bis der Benutzer die Maus klickt oder eine Taste drückt. 
 
fDone = F&ALSE; 
während (! fDone) {fDone = DoLengthyOperation(); / / anwendungsdefinierte Funktion / / alle Nachrichten, die möglicherweise in der Warteschlange zu entfernen. Wenn der / / Warteschlange enthält Maus oder Tastatur / / Nachrichten, Ende die Operation. 
 
    während (PeekMessage (Amp; msg, Hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {case WM_LBUTTONDOWN: Fall WM_RBUTTONDOWN: Fall WM_KEYDOWN: / / / / alle erforderlichen Cleanupmaßnahmen ausführen. 
                / / fDone = TRUE; 
        } 
    } 
} 

 

Andere Funktionen, einschließlich GetQueueStatus und GetInputState, auch können Sie den Inhalt der Meldungswarteschlange eines Threads zu untersuchen. GetQueueStatus gibt ein Array von Flags, die die Typen von Nachrichten in der Warteschlange angibt; mit es ist der schnellste Weg, um zu ermitteln, ob die Warteschlange Nachrichten enthält. GetInputState gibt TRUE zurück, wenn die Warteschlange Nachrichten für Maus oder Tastatur enthält. Beide Funktionen können verwendet werden, um festzustellen, ob die Warteschlange enthält Nachrichten, die verarbeitet werden müssen.

Index