Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Windows Messages - Tutorial?

  Alt 29. Nov 2007, 21:04
Messages ist ja DAS Windows-Kommunikationsmittel.
Nur in einer VCL-anwendung siehst du nicht mher allzuviel davon (wenn du es nicht erzwingst). Deswegen würde ich dir mal zu einem nonVCL-Tutorial raten (Luckie hat da z.B. eins). Vielleicht kommst du darüber auch an eins, welches dir direkt die Messageverarbeitung erklärt.


Hier mal kurz für die VCL (ohne jetzt tiefer drauf einzugehen):

1. Abschicken einer Message geht über Sendmessage oder Postmessage. Beide erwarten 4 Parameter:
-den Adressaten (Empfänger hiervon können alle Fenster sein), wird durch das Windowhandle (HWND) gekennzeichnet
-Eine MessageID (eine 32bit-Nummer, damit der Empfänger wies, wofür die Nachricht ist)
-Und die letzten beiden Parameter sind einfach 2 32-Bit Werte, welche du mit irgendetwas füllen kannst (natürlich so, dass es der Empfänger versteht)
Der Unterschied zwischen PostMessage und Sendmessage ist, dass Postmessage die NAchricht abschickt und im Programm einfach fortfährt, während Sendmessage das Programm anhält, bis der Empfänger auf die Nachricht reagiert hat (beim Empfänger wird eben eine Funktion aufgerufen und, wenn die durchgearbeitet ist, läuft dein Programm weiter und zusätzlich bekommst du noch das Ergebnis der Funktion als Ergebnis von Sendmessage)

[1a) Es gibt ach noch PostThreadMessage]

2. Der Empfänger kann über PeekMessage oder GetMessage eintreffende Nachrichten mit genau den 4 Parametern abrufen (das macht die VCL in etwa so, wenn sie grad nix zu tun hat, oder du Application.ProcessMessages aufrufst)
Messages empfangen kann in der VCL jedes Objekt, dass von TWinControl abgeleitet wurde (das sind ne ganze Menge) Alle diese Objekte haben als Property ein Windowhandle. Dieses Windowhandle musst du nur dem Sender irgendwie mitteilen (oder du bekommst es über Funktionen, wie "Findwindow", "EnumWindows", "Getwindow")
Zudem hat jedes TWincontrol die Methode "WndProc". Dort laufen alle Messages eines Fensters durch. Wenn du diese Methode überschreibst, hats du die Messageverarbeitung selber in der Hand. Das ist allerdings nicht zu empfehlen, besser ist es eine Methode zu implementieren, welche auf genau eine bestimmte Message (anhand MessageID) reagiert. Dazu musst du in der Deklaration hinter die Methode einfach "message yourMessageID" schreiben und als Parameter braucht die Methode "var Msg:TMessage"

3. Was gibt es so für MessageIDs. Also es gibt vordefinierte, für bestimmte Aktionen (z.B. WM_Create, WM_LButtonDown, WM_Close,...). Diese sollte man nur senden, wenn du damit eine bestimmte, von Windows vordefinierte, Aktion bezwecken willst.
Für alle anderen Aktionen gibt es WM_User+x (x relativ frei wählbar)

4. noch ein kurzes Beispiel für eigene Messages:
Delphi-Quellcode:
const WM_myMessage=WM_User+1;

type TForm1=class(TForm)
       procedure Button1Click(Sender:TObject);
      private
       procedure getMyMessage(var msg:TMessage); message MW_myMessage;
end;
....
procedure TForm1.Button1Click(Sender:TObject);
var res:integer;
    Erfolg:boolean;
begin
  memo1.lines.add('Wir senden: 5');
  //function sendmessage(wnd:HWND; MessageID:Integer; WParam:Integer; LParam:Integer): Integer;
  res:=sendmessage(self.handle,WM_myMessage,5,0);
        //wir senden mal an unser eigenes Fenster
  memo1.lines.add('Die Antwort ist '+inttostr(res));

  
  memo1.lines.add('Wir senden: 10');
  //function postmessage(wnd:HWND; MessageID:Integer; WParam:Integer; LParam:Integer): Boolean;
  Erfolg:=Postmessage(self.handle,WM_myMessage,10,0);
  if Erfolg then memo1.lines.add('Die Antwort ist erfolgreich gesendet')
            else memo1.lines.add('Die Antwort ist nicht gesendet');
end;

procedure TForm1.getMyMessage(var msg:TMessage);
begin
  memo1.lines.add(inttostr(msg.wparam)+' empfangen.');
  msg.result:=msg.wparam+1; //Das ist die Antowrt, welche man mit Sendmessage auch zurückbekommt.
end;

Editas war der falsche Button
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat