Programmieren mit Pascal & Delphi

FAQ, Probleme und Lösungen

System-Services

Hooking von WM_USER-Messages

Wie können die bei TApplication eintreffenden WM_USER-Nachrichten überwacht und bearbeitet werden?

Frage

Alle WM_USER-Nachrichten, die an eine Anwendung gerichtet sind, treffen bei TApplication.Handle ein. Von dort aus muß die Anwendung selbst dafür sorgen, daß die Nachricht dorthin gelangt, wo sie benötigt wird.

Als Beispiel für eine Vorgehensweise zur Behandlung der Events wird nachfolgend die Komponente THookUserMessage implementiert, die als nicht-visuelle Komponente einem Formular hinzugefügt wird und damit ermöglicht, Nachrichten an Application.Handle zu senden und von dort zu empfangen. Der Schlüssel für diese Funktionalität ist die TApplication-Methode.

procedure HookMainWindow(Hook: TWindowHook);

Mit HookMainWindow wird es externen Dialogfeldern möglich, Botschaften zu empfangen, die an das Hauptfenster der Anwendung gesendet wurden, indem die Methode sicherstellt, daß sich das externe Dialogfeld korrekt als untergeordnetes Fenster der Anwendung verhält, und nicht als Standalone-Fenster. Wenn das durch die Eigenschaft Handle identifizierte Fenster Dialogbotschaften erhält, werden diese an die Dialogprozedur, die im Parameter Hook übergeben wurde, weitergeleitet.

Die Komponente THookUserMessage nutzt dies aus, indem sie sich via HookMainWindow bei TApplication anmeldet und für jede eintreffende Nachricht einen Event erzeugt.

Das Anmelden der Klasse bei TApplication erfolgt sinnvollerweise im Konstruktor der Klasse.

constructor THKMessageReceiver.Create(AOWner: TComponent);
begin
 inherited create(AOwner);
 if ComponentState=[] 
   then begin
          Application.HookMainWindow(AppWindowHook);
          FHooked:=true;
        end 
   else FHooked:=false;
end;

Die Methode AppWindowHook ist wie folgt implementiert:

function THKMessageReceiver.AppWindowHook(
    var Message: TMessage): boolean;
begin
  result:=true;
  with message do 
  begin
    if (Msg >= WM_USER) and 
       (assigned(FOnReceiveMessage)) 
      then FOnReceiveMessage(msg, WParam, LParam);
    AppWindowHook := false;
  end;
end;

Damit ist sichergestellt, daß die Komponente die Nachrichten von TApplication erhält. Über das Behandeln des Events OnReceiveMessage kann das besitzende Formular der Komponente auf die Nachricht reagieren. Untereinander können Fenster einander informieren, indem bei Bedarf eine global definierte Nachricht

const WIN_UPDATE = WM_USER + $100;

an Application.Handle verschickt und von interessierten Formularen behandelt wird.

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-02-22 22:14:07 von textarchiv.alojado.de