天天看點

delphi中Message消息的使用方法

原文:http://blog.csdn.net/delphi1234/article/details/2110083

執行個體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.
           

繼續閱讀