Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , ОС и Железо , Сообщения Windows

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

Кот схватил мышку за хвост...
... и своротил со стола комп!


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

{ 
  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.

Это компонент Delphi, позволяющий поймать и обработать сообщения Windows в вашем приложении. Класс TMessageReceiver предназначен для привязки к основному окну вашего приложения с помощью метода Application.HookMainWindow, который вызывает функцию, определённую пользователем, для каждого отправленного сообщения в окно.

Следующий процесс:

  1. Создайте экземпляр компонента TMessageReceiver и добавьте его на форму или другой компонент.
  2. Компонент привязывается к основному окну вашего приложения с помощью Application.HookMainWindow.
  3. Когда сообщение отправляется в окно, функция MessageHook вызывается с параметром сообщения.
  4. Функция MessageHook проверяет, является ли сообщение пользовательским (WM_USER или выше), и вызывает соответствующий обработчик (DoUserMessage) или использует case-выражение для обработки других сообщений.

Компонент предоставляет два события:

  • OnDateTimeChange: триггерируется при изменении системного даты/времени
  • OnReceiveUserMessage: триггерируется для пользовательских сообщений

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

Пример использования компонента:

type
  TForm1 = class(TForm)
    MessageReceiver: TMessageReceiver;
    procedure MessageReceiverOnDateTimeChange(Sender: TObject);
    procedure MessageReceiverOnReceiveUserMessage(Msg: Cardinal; wParam, lParam: Integer);
  end;

var
  Form1: TForm1;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  MessageReceiver.OnDateTimeChange := OnDateTimeChange;
  MessageReceiver.OnReceiveUserMessage := OnReceiveUserMessage;
end;

procedure TForm1.MessageReceiverOnDateTimeChange(Sender: TObject);
begin
  // обработка события изменения даты/времени
end;

procedure TForm1.MessageReceiverOnReceiveUserMessage(Msg: Cardinal; wParam, lParam: Integer);
begin
  // обработка пользовательского сообщения
end;

В этом примере форма TForm1 имеет компонент TMessageReceiver и две процедуры, назначенные на события OnDateTimeChange и OnReceiveUserMessage. Когда изменяется системная дата/время или отправляется пользовательское сообщение, эти процедуры будут вызваны.

В статье описывается компонент TMessageReceiver для Delphi, который позволяет отлавливать и обрабатывать сообщения в приложении, используя метод HookMainWindow.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сообщения Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:55:41/0.0035409927368164/0