PeekMessage(): Alles außer Input-Messages abfangen
-
Hallo zusammen,
Um mich mit der WinAPI vertraut zu machen, schreibe ich gerade meine eigene Bibliothek zum Erstellen von Fenstern.
Zur Eventabfrage verwende ich folgendes Schema, was ich auch z.T. umgesetzt habe:
In die event_queue werden von event_sources events eingefügt. Ein Window ist zum Beispiel eine event_source. Im Programm wird dann eine event_queue erzeugt, bestimmte sources (das Fenster) hinzugefügt und mit window.poll_events() wird dann die event_queue gefüllt. window.poll_events() hat intern eine PeekMessage()-Loop, die die Events an die window proc sendet, die die event_queue des Fensters dann füllt.
So weit, so gut.
Nun habe ich einen keyboard_listener geschrieben. Der ist ebenfalls eine event_source und bekommt events von bestimmten Fenstern. keyboard_listener::poll_events() ruft intern window::poll_keys() auf, die eine weitere PeekMessage()-Schleife hat, die nur Key-Events abfängt und in die Queue des keyboard_listener einfügt. Das Problem ist nur, dass die generelle PeekMessage()-Loop alle Events (auch Keys) abfängt, was ich nicht will.
Ich habe bereits gegoogelt und bin auf diesen StackOverflow-Artikel gestoßen, der mir aber nicht wirklich weiterhilft: http://stackoverflow.com/questions/10568779/how-to-use-peekmessage-to-retrieve-every-messages-except-input-mouse-keyboard
Vielen Dank im Voraus,
Nathan
-
Wie wärs wenn dus so einrichtest dass die Schleife die die Keyboardmessages abfängt "ganz unten" ist, d.h. zuerst dran kommt ?
Oder du verwendest sowas wie
#define ALLES_AUSSER_INPUT (~PM_QS_INPUT & 0x0000)
Sollte so eigentlich gehen, ist aber ungetestet
-
Und warum schränkst Du nicht einfach bei PeekMessage die Nachrichten Bereiche ein?
Du müsstest für das generelle Abfangen halt zwei PeekMessaage abfragen setzen.Das ganze ist aber eigentlich Quatsch, nachmeiner Meinung.
Durch diese Trennung werden die Events in Reihenfolgen gesetzt, die Du nicht entsprechend abarbeitest.Ich verstehe auch nicht was dies überhaupt für einen Vorteil haben soll, denn die meisten Nachrichten werden direkt an die Fenster ausgeliefert.
-
Ich verstehe die Zielsetzung nicht vollständig. Die WinApi kennt allein Messages, keine Events. Letztere muss man durch Abfragen den Messages selbst einbauen. Vielleicht ist das Konzept von .Net und C# besser geeignet.
-
Ja, stimmt, ich hätte das nicht trennen dürfen.
Habe das jetzt anders gelöst.
Troztdem danke.