Кот схватил мышку за хвост...
... и своротил со стола комп!
{*************************************************************************}{
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(varMessage : TMessage) : Boolean ofobject;
{*************************************************************************}unit MessageReceiver;
interfaceuses
Windows, Messages, SysUtils, Classes, Forms, Dialogs;
type
TOnReceiveUserMessage = procedure(Msg: Cardinal; wParam, lParam: Integer;
var Handled: Boolean) ofobject;
TOnReceiveOtherMessage = procedure(var Handled: Boolean) ofobject;
TMessageReceiver = class(TComponent)
private{ Private declarations }
FHooked: Boolean;
FOnReceiveUserMessage: TOnReceiveUserMessage;
FOnDateTimeChange: TOnReceiveOtherMessage;
function MessageHook(var Msg: TMessage): Boolean;
protectedfunction 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;
procedureRegister;
implementationprocedureRegister;
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);
begininherited Create(AOwner);
FHooked := False;
ifnot (csDesigning in ComponentState) thenbegin
Application.HookMainWindow(MessageHook);
FHooked := True;
end;
end;
destructor TMessageReceiver.Destroy;
beginif FHooked then Application.UnhookMainWindow(MessageHook);
inherited Destroy;
end;
end.
Это компонент Delphi, позволяющий поймать и обработать сообщения Windows в вашем приложении. Класс TMessageReceiver предназначен для привязки к основному окну вашего приложения с помощью метода Application.HookMainWindow, который вызывает функцию, определённую пользователем, для каждого отправленного сообщения в окно.
Следующий процесс:
Создайте экземпляр компонента TMessageReceiver и добавьте его на форму или другой компонент.
Компонент привязывается к основному окну вашего приложения с помощью Application.HookMainWindow.
Когда сообщение отправляется в окно, функция MessageHook вызывается с параметром сообщения.
Функция MessageHook проверяет, является ли сообщение пользовательским (WM_USER или выше), и вызывает соответствующий обработчик (DoUserMessage) или использует case-выражение для обработки других сообщений.
Компонент предоставляет два события:
OnDateTimeChange: триггерируется при изменении системного даты/времени
OnReceiveUserMessage: триггерируется для пользовательских сообщений
Вы можете назначать процедуры на эти события в Инспекторе объектов или программно, установив соответствующие свойства.
Пример использования компонента:
typeTForm1=class(TForm)MessageReceiver:TMessageReceiver;procedureMessageReceiverOnDateTimeChange(Sender:TObject);procedureMessageReceiverOnReceiveUserMessage(Msg:Cardinal;wParam,lParam:Integer);end;varForm1:TForm1;implementationprocedureTForm1.FormCreate(Sender:TObject);beginMessageReceiver.OnDateTimeChange:=OnDateTimeChange;MessageReceiver.OnReceiveUserMessage:=OnReceiveUserMessage;end;procedureTForm1.MessageReceiverOnDateTimeChange(Sender:TObject);begin// обработка события изменения даты/времениend;procedureTForm1.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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.