Delphi中Message消息的三种使用方法,很简单直观

实例1

unit Unit1;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

const
WM_ME=WM_USER+100; //自定义消息;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
//第一种消息处理方式; 只能处理常量消息;
procedure wmme(var message:TMessage);message WM_ME; //自定义消息处理过程,专门处理WM_ME消息
public
//第二种消息处理方式;可能处理常量或变量消息;
procedure WndProc(var message:TMessage);override; //重载窗口消息过程
//第三种消息处理方式
procedure WMCommand(var Message: TWMCommand); message WM_COMMAND; //命令消息处理过程
procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SYSCOMMAND; //处理系统性消息;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Handle,WM_ME,0,0); // 发送消息WM_ME ; 消息先由WndProc处理,再交给wmme处理;
end;

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
//下面代码的作用是,用户如果点击了标题栏上的最小化和关闭按钮,则隐藏窗体。
if (Msg.CmdType=SC_MINIMIZE) or (Msg.CmdType=SC_CLOSE) then
begin
Self.Hide; // 拦截了系统消息(我猜不能拦截普通消息),而且不再执行DefaultHandler。测试,可以把DefaultHandler放在这句之前和这句之后,先后顺序很明显。
end else
DefaultHandler(Msg); // 这句的作用是继续处理其它消息;
end;

procedure TForm1.WMCommand(var Message: TWMCommand);
begin //第三种消息处理方式
if Message.NotifyCode = BN_CLICKED then // 我怀疑可以拦截所有的消息?
if FindControl(Message.Ctl) = Button1 then showmessage(‘点击了Button1’);
inherited; // 屏蔽这句话的话,Button1Click的内容就不再执行了
end;

procedure TForm1.WndProc(var message: TMessage);
begin
if message.Msg=WM_ME then // 第二种消息处理方式,我怀疑可以拦截所有的消息?
ShowMessage(IntToStr(Handle)+ ‘WndProc‘);
inherited WndProc(Message); // 这里inherited才会触发一次wmme消息;所以先执行WndProc,后执行wmme消息
end;

procedure TForm1.wmme(var message: TMessage);
begin
ShowMessage(IntToStr(Handle)+ ‘wmme‘); // 第一种消息处理方式
end;

end.

==================================消息的广播方式==================================
///////消息广播只能将消息传递到接收消息的主程序中,MDIChild窗体不能接收到广播消息;/////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WndProc(var message:TMessage);override;
end;
var
Form1: TForm1;
MyMessage: DWORD;


implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WndProc(var message: TMessage); // 可处理自定义消息
begin
if message.Msg=MyMessage then // 第3步:重载Windows消息处理过程,处理接收到的MyMessage消息;
ShowMessage(FloatToStr(Handle)+ ‘MyMessage‘); // 每次程序关闭后再启动,句柄值不一样。但不关闭就是同一个值
inherited WndProc(Message); // 其实没什么用,但是屏蔽后出错
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST,MyMessage,0,0); //第2步:发送MyMessage消息,相当于广播;而且两个程序都执行了的话,一个处理完另一个才能开始处理。可以试试PostMessage的区别
end;
/////////预先注册好Windows消息;第一种方法////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
//同一字符串,如‘MyMessageMe‘ 在不同的程序中调用RegisterWindowMessage注册消息时,返回的MyMessage结果是一样的。这样为在不同程序之间广播消息提供了可能。即不同程序注册消息时,必须注册相同的注符串。
MyMessage:=RegisterWindowMessage(‘MyMessageMe‘); //第1步:注册Windows消息,重点在于返回的值MyMessage
end;
/////////预先注册好Windows消息;第二种方法////////////////////
{ initialization
MyMessage:=RegisterWindowMessage(‘MyMessageMe‘);
}


//BroadcastSystemMessage,可以在进程之间广播消息;
procedure TForm1.SendSMSMessage;
var
SMSMessage:Cardinal;
recipt:Cardinal;
begin
try
SMSMessage:=RegisterWindowMessage(‘SendSMSMessage‘);
recipt:=BSM_ALLDESKTOPS; //所以桌面程序都可以接收
BroadcastSystemMessage(BSF_POSTMESSAGE,@recipt,SMSMessage,0,0);
except

end;
end;

end.

参考:

http://www.cnblogs.com/key-ok/p/3417727.html

Delphi中Message消息的三种使用方法,很简单直观

上一篇:Delphi 7里Messages.pas里所有104种重定义消息种类,180种不同的消息名称


下一篇:Unity3D笔记十一 定制导航菜单栏