Was enthält eine Windows-Botschaft?

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Das Botschaftsbehandlungssystem


Eine Windows-Botschaft ist ein Datensatz mit mehreren Feldern. Das wichtigste Feld enthält einen Wert im Integer-Format, der die Botschaft identifiziert. Für alle Windows-Botschaften sind in der Unit Messages entsprechende Bezeichner deklariert. Weitere nützliche Informationen in einer Botschaft sind in zwei Parameterfeldern und einem Ergebnisfeld enthalten.

Ein Parameter enthält 16 Bit, der andere 32 Bit. Häufig tritt Windows-Quelltext auf, der diese Werte als wParam und lParam bezeichnet, für Word-Parameter und Long-Parameter. In vielen Fällen enthält jeder Parameter mehr als eine Information, und Sie sehen Verweise auf Namen wie lParamHi, der auf das höherwertige Wort im Long-Parameter verweist.

Ursprünglich mussten sich Windows-Programmierer merken, was in den einzelnen Parametern enthalten ist (oder in der Windows-API nachschlagen). Nun hat Microsoft diesen Parametern Namen gegeben. Mit diesem so genannten Message Cracking lassen sich die in den einzelnen Botschaften enthaltenen Informationen wesentlich einfacher verstehen. So heißen die Parameter für die Botschaft WM_KEYDOWN jetzt nVirtKey und lKeyData, was wesentlich spezifischere Informationen liefert als wParam und lParam.

Für jeden Typ von Botschaft definiert Delphi einen Datensatztyp, der jedem Parameter einen mnemonischen Namen zuweist. So übergeben beispielsweise Mausbotschaften die X- und Y-Koordinaten des Mausereignisses im Long-Parameter, einen im höherwertigen Wort und den anderen im niederwertigen Wort. Bei dieser Verwendung der Mausbotschaftsstruktur müssen Sie sich keine Gedanken über die Bedeutung der einzelnen Wörter machen, da Sie auf die Parameter mit den Namen XPos und YPos verweisen, anstatt mit lParamLo und lParamHi



 void MyKeyDownHandler(  HWND hwnd, UINT nVirtKey, BOOL fDown, int CRepeat, UINT flags )
 {
   .
   .
   .
 }
 LRESULT MyWndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
 {
   switch(  Message )
   {
     HANDLE_MSG( hwnd, WM_KEYDOWN, MyKeyDownHandler );
     .
     .
     .
 }