![]() |
WinApi - Wofür GetMessage-Loop?
Hallo liebe Community,
ich versuche gerade herauszufinden, was genau bei der WinApi-GUI-Programmierung dieses Grundgerüst macht: Code:
#include <windows.h>Viel mehr geht es mir um die Windows-Besonderheiten, die mich ein klein wenig verwirren. Ich habe jetzt ein bisschen nachgelesen und msdn benutzt, aber mir ist sowohl das Gefundene zu ungenau als auch msdn. Ich geh mal der Reihe nach den Code (ganz grob) durch, damit hier nicht jedes Stück erklärt wird und ihr seht was ich falsch verstanden habe/was nicht. :D Quote:
Fenster bekommt Message gesendet (z.B. über Maus, SendMessage, o.ä.) --> Fenster (bzw. genauer gesagt Windows) ruft für jede ankommende Nachricht automatisch die CALLBACK Funktion auf --> in der Funktion wird dann auf die Message reagiert (oder auch nicht) :D Läuft das wirklich so ab? Fehlen da Schritte dazwischen? Oder kann man das grob zusammengefasst so sagen? Dann gehts weiter mit der main, die ist soweit ja auch klar, bissel Structs füllen und Pointer/Objekte/etc. holen. Bis zu der Stelle der While-Schleife ist mir alles klar. Code:
while (GetMessage(&msg, NULL, 0, 0) > 0)Zuerst wird per GetMessage die aktuelle message aus der Warteliste des Prozesses/Threads geholt (von dem angegebenen Fenster). Anschließend wandle ich ich die Message in irgendeine Art von "virtual key" um (was auch immer das genau ist). Für mich klingt das einfach nur nach eine Art Mapping bzw. casting. Anschließend wird die message versandt, aber wohin? DispatchMessage hat keinerlei Handle-Angabe, die message scheint also nicht an mein Fenster verschickt zu werden, sondern "irgendwohin"?! Worauf das alles hinausläuft ist unter anderem auf diese Frage: Kann ich die While-Schleife auch weglassen (bzw. zumindest leeren) ohne, dass ich Einschränkungen in der Message-Verarbeitung habe? Dass man dies Messages dann irgendwo anders holen/verwerfen/etc. muss ist mir klar, aber warum dann nicht direkt in der Callback-Funktion am Anfang/Ende? |
Das Design dieses Teils der WinAPI ist zu Teilen meiner Meinung nach ziemlich misslungen, da will man sich nicht wirklich mit beschäftigen. Daher auch alle Informationen von mir unter Vorbehalt sehen. Habe damit lange nichts mehr gemacht und vieles selbst nur gehört.
Du brauchst die while-Schleife an einer Stelle deines Programmes. Erst durch diese findet die Messageverarbeitung statt. Irgendwo durch DispatchMessage wird afaik deine Callback-Funktion aufgerufen. Theoretisch könntest du die Callback-Funktion weglassen und die Verarbeitung direkt in der while-Loop machen. Die Angabe eines Handles für DispatchMessage ist nicht nötig bzw. nicht wirklich möglich, weil du durch den Loop Messages für jedes mit dem Thread assoziierte Fenster bekommst (oder für den Thread generell). Das entsprechende Handle zum betroffenen Fenster befindet sich schon in der [Only registered and activated users can see links. Click Here To Register...]. Nettes Projekt mit der Sprache im Übrigen. Rein vom lehr- bzw. lernwert (dort aber umso mehr), denn generell halte ich den Markt der Sprachen für durchaus gesättigt. Mit freundlichen Grüßen Jeoni P.S.: Die oberen beiden Links ("About ..." und "Using ...") von [Only registered and activated users can see links. Click Here To Register...] könnten vielleicht noch etwas zum Verständnis beitragen. |
Quote:
Um es noch einmal kurz zusammen zu fassen, was wirklich passiert, wenn ein Prozess eine Message bekommt (für eventuelle Googler): 1. Die Message wird in die Message-Warteschlange des Threads eingereiht nach dem FIFO-Prinzip. Es wird keinerlei Message/Callback oder ähnliches aufgerufen. 2. Die Message muss "per Hand" aus der Warteschlange entfernt werden, dafür benutzt man GetMessage. 3. TranslateMessage ist dafür da, um Keyboard-Eingaben richtig zu verarbeiten (also scheinbar in den Basis-Fällen ala "isButtonClicked", etc. überflüssig). 4. Sobald DispatchMessage aufgerufen wird, wird asynchron (?) die festgelegte Prozedur aufgerufen und die Message entsprechend übergeben. Der Clou an der ganzen Sache (vor allem am DispatchMessage) ist, dass das WindowHandle auch in der Message-Struct selbst gespeichert wird: Quote:
Das Weglassen der Schleife (bzw. der DispatchMessage-Methode) heißt gleichzeitig, dass das Fenster auf keinerlei Eingaben/Messages mehr reagiert. |
Ja das ist richtig.
Falls du jetzt in richtung multi Window gehst musst du darauf achten das 1 Schleife mehrere Fenster handelt. |
Kleine Ergänzungen:
Quote:
Quote:
Und deswegen könntest du die Loop auch nicht weglassen. Nicht nur, dass dein Programm dann keine Nachrichten verarbeiten würde, es würde de facto sofort beendet werden. Das Verweilen in der Message Loop ist schließlich das einzige in deinem Code, das den Main Thread davon abhält, direkt wieder aus der WinMain zu returnen und somit den Prozess zu beenden. Quote:
|
Quote:
Danke dir für die Ergänzungen, gut zu wissen, dass das als "simpler" Funktionsaufruf implementiert ist. Und ich dachte Windows ist was Besonderes. :D |
| All times are GMT +2. The time now is 13:48. |
Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.