Главная страницаОбратная связьКарта сайта

Отловить сообщение в компоненте


{*************************************************************************}

{ 
  TApplication besitzt eine Methode HookMainWindow. 
  Damit kann man in die Windows Prozedur (WndProc) "einhaken" und Nachrichten, 
  welche an die Applikation geschickt werden, abfangen und behandeln. 

  HookMainWindow is wie folgt deklariert: 
} 

procedure HookMainWindow(Hook : TWindowHook); 

{ Und der Parameter TWindowHook (Methoden Pointer) so: } 

type 
  TWindowHook = function(var Message : TMessage) : Boolean of object; 
 

{*************************************************************************} 

unit MessageReceiver; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Forms, Dialogs; 

type 
  TOnReceiveUserMessage = procedure(Msg: Cardinal; wParam, lParam: Integer; 
    var Handled: Boolean) of object; 
  TOnReceiveOtherMessage = procedure(var Handled: Boolean) of object; 

  TMessageReceiver = class(TComponent) 
  private 
    { Private declarations } 
    FHooked: Boolean; 

    FOnReceiveUserMessage: TOnReceiveUserMessage; 
    FOnDateTimeChange: TOnReceiveOtherMessage; 

    function MessageHook(var Msg: TMessage): Boolean; 
  protected 
    function DoDateTimeChange(Msg: TMessage): Boolean; dynamic; 
    function DoUserMessage(Msg: TMessage): Boolean; dynamic; 
  public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
  published 
    { Published declarations } 
    property OnDateTimeChange: TOnReceiveOtherMessage 
      read FOnDateTimeChange write FOnDateTimeChange; 
    property OnReceiveUserMessage: TOnReceiveUserMessage 
      read FOnReceiveUserMessage write FOnReceiveUserMessage; 
  end; 
   
procedure Register; 

implementation 

procedure Register; 
begin 
  RegisterComponents("System", [TMessageReceiver]); 
end; 

function TMessageReceiver.MessageHook(var Msg: TMessage): Boolean; 
begin 
  Result := False; 
  // User defined messages 
  if (Msg.Msg >= WM_USER) then 
    Result := DoUserMessage(Msg) 
  else 
    // Other messages 
    case Msg.Msg of 
      WM_TIMECHANGE: Result := DoDateTimeChange(Msg); 
      // ... 
    end; 
end; 

function TMessageReceiver.DoDateTimeChange(Msg : TMessage): Boolean; 
begin 
  Result := False; 
  if Assigned(FOnDateTimeChange) then 
    FOnDateTimeChange(Result); 
end; 

function TMessageReceiver.DoUserMessage(Msg: TMessage): Boolean; 
begin 
  Result := False; 
  if Assigned(FOnReceiveUserMessage) then 
    FOnReceiveUserMessage(Msg.Msg, Msg.wParam, Msg.LParam, Result); 
end; 

constructor TMessageReceiver.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  FHooked := False; 
  if not (csDesigning in ComponentState) then 
  begin 
    Application.HookMainWindow(MessageHook); 
    FHooked := True; 
  end; 
end; 

destructor TMessageReceiver.Destroy; 
begin 
  if FHooked then Application.UnhookMainWindow(MessageHook); 
  inherited Destroy; 
end; 

end.


Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Отловить сообщение в компоненте", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info