Message使用

  消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,

它在Windows单元中是这样声明的:

type
 TMsg = packed record
 hwnd: HWND; / /窗口句柄
 message: UINT; / /消息常量标识符
 wParam: WPARAM ; // 32位消息的特定附加信息
 lParam: LPARAM ; // 32位消息的特定附加信息
 time: DWORD; / /消息创建时的时间
 pt: TPoint; / /消息创建时的鼠标位置
end;

  hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。

  message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。

  wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。

  lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,因此,它们之间可以相互转换

实例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消息; private
   { Private declarations }
 public
{ Public declarations }
//第二种消息处理方式;可能处理常量或变量消息;
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;
  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;
end;
 
procedure  TForm1.wmme(var message: TMessage);
begin
 ShowMessage(IntToStr(Handle)+ 'wmme'); //第一种消息处理方式
end;
 
procedure  TForm1.WndProc(var message: TMessage);
begin
   if message.Msg=WM_ME then //第二种消息处理方式
     ShowMessage(IntToStr(Handle)+ 'WndProc');
 inherited WndProc(Message); //这里inherited才会触发一次wmme消息;
end;
end.
 
实例2/////////////////////////////////////////////////////////////消息的广播方式/////////////////////////////////////////////////////////////////////////////
///////消息广播只能将消息传递到接收消息的主程序中,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消息;
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://blog.csdn.net/delphi1234/article/details/2110083

原文地址:https://www.cnblogs.com/zhrong/p/5704299.html