Message Queue auslesen
-
Kann ich die anstehenden Windows-Messages auslesen, ohne dass sie aus der Queue entfernt werden? Mit PeekMessage und dem Parameter PM_NOREMOVE kann man ja nur die jeweils erste Message auf diese Weise ermitteln. Aber ich würde jetzt gern alle noch nicht verarbeiteten Messages auslesen, aber ohne dass sie dadurch aus der Queue entfernt werden.
-
Also ungefähr sowas hier: http://msdn.microsoft.com/de-de/library/system.messaging.messagequeue.getallmessages.aspx
Bloß für reines WinAPI.
-
Diese Funktion in .NET betrifft nicht die Windows Message Queue.
Und ansonsten gibt es keine Möglichkeit die Nachrichten Queue abzusuchen.
Warum willst Du das denn tun?Ansonten: Spätestens beim GetMessage hättest Du die Chance für einen Hook...
-
Martin Richter schrieb:
Und ansonsten gibt es keine Möglichkeit die Nachrichten Queue abzusuchen.
Warum willst Du das denn tun?Stell dir vor, du hast irgendein GUI-Framework, wo die Message Queue gekapselt und selbst verarbeitet wird, so dass ich an die Stelle, wo das GetMessage aufgerufen wird, gar nicht rankomme. Ich will aber trotzdem gerne einige Messages manuell abfangen und drauf reagieren. Würde ich jetzt PeekMessage mit PM_NOREMOVE aufrufen, könnte ich immer nur die jeweils erste Message abfragen. Würde ich PeekMessage mit PM_REMOVE aufrufen, würde ich der internen Message-Verarbeitung die Messages wegnehmen.
-
1. Nenne mir einen Fall in dem Du im Vorhinein Nachrichten in der Queue ansehen musst.
2. Ist die Queue sowieso fast immer leer. Was denkst Du denn was da so tolles drin wäre?
3. Kommen dort kaum nachrichten rein, außer Maus und Tastatur Events. Nicht mal Timer, oder WM_APINT Nachrichten sind da "drin", sondern werden erzeugt bei PeekMessage/GetMessage
4. Steht es Dir frei einen GetMessage Hook zu verwenden, da kommst Du an alles ran.Ich sehe nicht einen Anwednungsfall, bei dem man solch eine Funktion benötigen würde.
-
Vielleicht ist das was für dich: Examining a Message Queue.
Ansonsten bleibt dir wohl nichts anderes übrig als alle Nachrichten per GetMessage abzuholen und per PostMessage wieder zu senden. Du kannst zuerst eine spezielle Ende-Message senden, danach alles holen und wieder senden bis du an der Ende-Message bist, damit du weißt wann du durch bist.
Du solltest möglichst mit SuspendThread und ResumeThread sichergehen, dass kein anderer Thread auf die Message Queue zugreift, sonst gibt es ein heilloses Durcheinander. Zum Beispiel wenn der Nutzer "Hallo" eintippt, du die Nachrichten für "Hal" abfängst und wieder sendest und die GUI dann "loHal" liest oder die Ende-Message verschluckt.
Du hast aber weiterhin das Problem, dass die GUI eine Message fressen kann die du dann nie zu sehen bekommst, also bleibt dir wohl nur der GetMessage Hook.
-
nwp2 schrieb:
Du solltest möglichst mit SuspendThread und ResumeThread sichergehen, dass kein anderer Thread auf die Message Queue zugreift, sonst gibt es ein heilloses Durcheinander.
Man kan nicht auf andere Messages Queues zugreifen. Jederr Thread hat immer seine eigene.
Da muss man nichts absichern und schon gar nicht mit SuspendTheead!
http://blog.kalmbachnet.de/?postid=6
http://blog.kalmbachnet.de/?postid=16
-
Ok, damit funktioniert das nicht. Es gibt ein PostThreadMessage, aber kein GetThreadMessage. In MSDN steht was von "Note that journal hooks attach threads to the same queue". Damit sollte es dann gehen.