delphi 自定义类接收消息

文章描述:-2022年2月18日发(作者:3500元电脑配置单)Windows消息是在Windows和你的应用程序之间的通信的关键因素,也是两个应用程序之间通信的关键因素。 即使是你不处理,Windows消息仍然会被发送到您的应用程序的表单里。例如,当用户关闭应用程序中的时候,WM_CLOSE消息发送到窗口表单,表单再关闭(如果你没有编程处理这个消息的话)。 一个应用程序要接收窗口消息,应用程序必须提供

-

delphi 自定义类接收消息 2022年2月18日发(作者:3500元电脑配置单)


Windows消息是在Windows和你的应用程序之间的通信的关键因素,也是两个应用程序之间
通信的关键因素。
即使是你不处理,Windows消息仍然会被发送到您的应用程序的表单里。例如,当用户关闭
应用程序中的时候,WM_CLOSE消息发送到窗口表单,表单再关闭(如果你没有编程处理这
个消息的话)。
一个应用程序要接收窗口消息,应用程序必须提供一个消息可以被发送到的窗体。在正常情
况下,这窗口是应用程序中的主窗体。你写一个程序来处理特定的消息像WM_CHitTest。

但是,如果你没有一个窗体来接收消息,应该怎么办呢?如果你想从你自定义的TObject
派生的类来处理消息又该怎么办呢?
用这个类来处理windows消息 TMyObject =类(TObject)
一个Delphi控件有一个窗口句柄(来自TWinControl)可以接收Windows消息。TObject
没有实现窗口句柄,因此,您的(派生自TObject)任何自定义类都不能接受和处理Windows
消息,至少“默认”是不能接收的。

为了使您的自定义类能接收Windows消息,你必须提供一个消息的发送者的窗口句柄,。
诀窍是使用下面的方法(在定义 - 因此,可以直接使用):
* AllocateHWnd(WndMethod:TWndMethod)。 AllocateHWnd用于创建一个不与窗口
控件关联的窗口。
*WndMethod:TWndMethod指定的生成的窗口用来响应消息的窗口过程。
* DeallocateHWnd。 DeallocateHWnd销毁AllocateHWnd函数创建的窗口。
下面这个 TMsgReceiver类就是一个从TObject继承的能接受和处理Windows消息的自定义
类。

interface
TMsgReceiver = class(TObject)
private
fMsgHandlerHWD : HWD;
procedure WndMethod(var Msg: TMessage);
public
ctructor Create;
destructor Destroy; override;
end;
implementation


ctructor ;
begin
inherited Create;
fMsgHandlerHWD := AllocateHWnd(WndMethod);
end;
destructor y;
begin
DeallocateHWnd(fMsgHandlerHWD);
inherited;
end;
procedure hod(var Msg: TMessage);
begin
if = WM_MY_UIQUE_MESSAGE then
begin
do something
end
else
:= DefWindowProc(fMsgHandlerHWD, , ,
);
end;

在WndMethod程序(为隐藏窗口的窗口过程),你可以处理你感兴趣的所有消息,并确保任
何不默认处理的消息都将调用一个DefWindowProc过程,
有了上述的框架, 你可以处理来自其他应用程序发送的消息。

假设一些应用程序使用RegisterWindowMessage API调用来注册Windows消息。
RegisterWindowMessage函数通常用于注册两个应用程序之间的合作交流消息。
在“发送”的应用程序将有这样一行:
WM_MY_APP_MESSAGE:= RegisterWindowMessage('MSG_MY_APP_MESSAGE');
WM_MY_APP_MESSAGE是发送消息到所有Windows的代号。
比方说,我们发送这个窗体的onMouseDown事件的消息:

procedure useDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
PostMessage(HWD_BROADCAST, WM_MY_APP_MESSAGE, x, y);
end;

HWD_BROADCAST参数可确保我们的WM_MY_APP_MESSAGE 发送到所有顶层窗口,包括未激活
或无主窗口不可见的,重叠窗口和
弹出窗口和我们TMsgReceiver创建的隐藏窗口。
要在TMsgReceiver里处理消息需要有WndMethod过程:

procedure hod(var Msg: TMessage);
begin
if = WM_MY_UIQUE_MESSAGE then
begin
Point.X := ;
Point.Y := ;
just to have some 以下为自己的输出处理程序
(Point.X, Point.Y);
end
else
:= DefWindowProc(fMsgHandlerHWD, , ,
);
end;

“Point”是TMsgReceiver的字段。 TMsgReceiver用来保存你接收的其他应用程序窗体的
鼠标点击位置。
该WM_MY_UIQUE_MESSAGE还需要在TMsgReceiver注册。

-

delphi 自定义类接收消息

发布时间:2022-02-18 22:25:53
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 5 条评论,829人围观)

最近发表

随便看看

热门文章

标签列表