delphi中Message消息的使用方法
2016-03-06 16:35
405 查看
原文:/article/10370356.html
实例1
实例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.
相关文章推荐
- 现在, Delphi 的多线程已经非常易用了!
- Delphi实现截屏存盘的方法
- Why we need interfaces in Delphi
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)
- 深入Delphi -- Windows 消息机制
- Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单
- 关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)
- String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
- 外国的Delphi网站
- Delphi word
- delphi 数据导出到word
- Delphi制作DLL
- Delphi RichEdit 读取剪切板
- Delphi 打印
- Delphi Code Editor 之 几个特性(转)
- Delphi历史版本介绍(二)从Delphi8到DelphiXE3
- Delphi历史版本介绍(一)从Delphi1到Delphi7
- Delphi的DLL里如何实现定时器功能?
- Delphi安装NT服务程序时,不出现提示信息
- Delphi XE2 升级项目编译ralease版本,无法添加UAC解决方法