Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)
实例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.
===================================================================
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WndProc(var AMessage:TMessage);override;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WndProc(var AMessage: TMessage);
begin
if (AMessage.Msg=WM_SYSCOMMAND) and (AMessage.WParam=SC_CLOSE) then
Exit
else
inherited; end; end.
参考:http://www.cnblogs.com/key-ok/p/3417727.html
Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)的更多相关文章
- Electron与jQuery中$符号冲突的三种解决方法
在Electron工程中引用jQuery时,经常会出现以下错误: Uncaught ReferenceError: $ is not defined 解决的具体方法如下: ①.在测试的过程中(测试过1 ...
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
- Jquery中each的三种遍历方法
Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- ASP.NET缓存中Cache过期的三种策略
原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...
随机推荐
- 最简单简洁高效的Json数据解析
一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...
- Gizmos 辅助线框
Gizmos are used to give visual debugging or setup aids in the scene view. Gizmos是用于在场景视图可视化调试或辅助设置. ...
- ios网络学习------10 原生API文件上传
使用原生态的api上传文件的实现: #import "MainViewController.h" @interface MainViewController () @propert ...
- java精确除法计算,四舍五入 Java问题通用解决代码
主要用java.math.BigDecimal工具类实现,想要了解BigDecimal类可以看java api 正式版: public static Double divide() ...
- 转MQTT--mosquitto服务器系统内容主题
MQTT客户端可以通过订阅位于$SYS层次下的主题来查看mosquitto服务器的状态信息.标记为Static的主题对于每一次订阅只发布一次.其它所有主题每隔sys_interval(在mosquit ...
- java游戏开发基础Swing之JCheckBox
© 版权声明:本文为博主原创文章,转载请注明出处 1.复选框(JCheckBox) 使用复选框可以完成多项选择.Swing中的复选框与AWT中的复选框相比,优点是Swing复选框中可以添加图片 JCh ...
- performSelector 方法的自己主动俘获特性
局部变量自己主动俘获 偶然在调试中发现,performSelector 方法具有自己主动俘获变量的特性.试看例如以下代码: CGFloat c = _addViewShowing ? 0 : 80; ...
- HDU 4883 TIANKENG’s restaurant Bestcoder 2-1(模拟)
TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/O ...
- 官方教程Stealth学习笔记(一)
今天開始要更新官方教程stealth的学习笔记啦, 我将会记录和解说一个小游戏基本的流程和关键地方的技巧. 我会依照官方教程的顺序来更新. ...
- UIview层次管理
将一个UIView显示在最前面只需要调用其父视图的 bringSubviewToFront()方法. 将一个UIView层推送到背后只需要调用其父视图的 sendSubviewToBack()方法.