怎么让一个非窗口组件可以接受来自Windows的消息
为什么要这样做?
有时候我们需要一个非窗口组件(比如一个非继承自TWinContrl的组件)可以接受Windows消息。要接受消息就需要一个窗口句柄,但是非窗口组件却没有句柄。这篇文章将讲述怎么让一个没有句柄的组件如何通过一个隐藏的窗口接受消息
这是怎么做到的?
例如
我的剪贴板查看组件就是一个不可视的组件。这个窗体可以接收提供信息关于更改剪贴板的消息。
Delphi库里面的AllocateHWnd函数可以帮助我们创建一个隐藏的窗口,同时与之相关的DeallocateHWnd函数可以释放当我们使用完的隐藏窗口。这个隐藏的窗口将命令窗口过程。当Windows通常调用一个stdcall函数时,AllocateHWnd函数能让我们像窗体过程一样的使用方法。我们通过一个引用allocatehwnd函数所需的方法来并将它注册为一个窗口过程的方法来解决问题。在这个被注册的方法内部我们可以处理我们感兴趣的消息同时传递给Windows
下面的代码清单2停工了一个如何使用AllocateHWnd函数的框架。尽管如此,我们的代码清单1定义一个组件类的轮廓:
程序代码type
{*******************************
Our class derived from TComponent
or another ancestor class
********************************}
TMyClass = class(TComponent)
private
fHWnd: HWND;
{*******************************
field to store the window handle
存储窗口句柄的字段
********************************}
...
protected
procedure WndMethod(var Msg: TMessage); virtual;
{*******************************
window proc - called by Windows
to handle messages passed to our
hidden window
窗口过程的调用Windows将通过我们的
隐藏窗口来处理消息
********************************}
...
public
constructor Create(AOwner: TComponent); override;
{*******************************
create hidden window here:
store handle in fHWnd
这里创建隐藏窗体,并且把它的句柄
存储在fHWnd字段。
********************************}
destructor Destroy; override;
{*******************************
free hidden window here
销毁隐藏窗口过程
********************************}
...
end;
------------------代码清单1------------------
同时下面将是实现部分的详细代码:
程序代码constructor TMyClass.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
//创建影藏窗口并且用WndMethod过程
fHWnd := AllocateHWnd(WndMethod);
...
end;
destructor TMyClass.Destroy;
begin
...
//销毁隐藏窗口
DeallocateHWnd(fHWnd);
...
inherited Destroy;
end;
procedure TMyClass.WndMethod(var Msg : TMessage);
var
Handled: Boolean;
begin
//假定我们可以处理消息
Handled := True;
case Msg.Msg of
WM_SOMETHING: DoSomething;
//处理消息的代码
WM_SOMETHINGELSE: DoSomethingElse;
//处理另一个消息的代码
//这里处理其他的消息
else
//我们不再处理消息
Handled := False;
end;
if Handled then
//我们在消息记录里处理消息
Msg.Result := 0
else
//我们通过DefWindowProc函数
//不处理的消息同时记录结果
Msg.Result := DefWindowProc(fHWnd,
Msg.Msg,
Msg.WParam,
Msg.LParam);
end;
------------------代码清单2------------------
当然,我们正是使用Windows API函数创建一个窗体这种困难的方法提供给Windows过程。它是一种用一个方法作为一个窗口过程很困难的方法,如果我们使用它的话。关于AllocateHWnd函数明智的用法是a创建一个隐藏的窗口给我们同时B允许我是用一个方法。而不是一个简单的函数作为窗口的过程同时一个方法自从他存取了类的私有数据后变得很有用。
后记:第一次翻译文章,可能有些地方理解的不是很透彻,所以附录原文地址如下.
原文:http://www.delphidabbler.com/articles?article=1
怎么让一个非窗口组件可以接受来自Windows的消息的更多相关文章
- 让一个非窗口组件(non-windowed component)可以接受来自Windows的消息
为什么要这样做? 有时候我们需要一个非窗口组件(比如一个非继承自TWinContrl的组件)可以接受Windows消息.要接受消息就需要一个窗口句柄,但是非窗口组件却没有句柄.这篇文章将讲述怎么让一个 ...
- C#中接受一个非字符串的输入
接受来自用户的值 System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中. 例如: int num; num = Conve ...
- .net core MVC接受来自自前端的GET和POST请求方法的区别
小伙伴们都知道,常用的http请求有两种方式,即GET方法和POST方法,很多刚入门的童鞋难免都会有一个误区,是不是GET是从服务器上获取数据,POST是向服务器传送数据? 我的理解是:不论是GET还 ...
- Java成长之路--一个非科班生的进阶之路
前言 笔者从事Java开发六年有余,从什么都不懂的小白一路成长到上市公司管理20人的技术leader.管理的团队,虽然人数不算多,但也是对于我这个非科班生这么多年努力的一种肯定.在技术的道路上,我没有 ...
- 4年前端、2年CTO:一个非科班程序员的真实奋斗史
1.引言 我,Scott,一家创业公司的 CTO. 从业6年却很少写文章,近一年来接触了几十个刚毕业的前端新人,也面试了100多个前端工程师和Nodejs工程师,对于前端发展的这个职业算是有些感触 ...
- 一步步玩pcDuino3--uboot下的ping,加入命令能够接受来自host的ping
uboot是一个很优秀的开源项目.不只能够学习bootloader.嵌入式,各种总线协议. 还能够了解网络协议栈.在嵌入式开发中,常常使用uboot的tftp和nfs来加快开发的效率.那么在tftp能 ...
- 一个非侵入的Go事务管理库——如何使用
在文章"清晰架构(Clean Architecture)的Go微服务: 事物管理"中,我谈到了如何在清晰架构中实现非侵入的事务管理. 它允许你把事务代码与业务逻辑代码分开,并且让你 ...
- Java-Spring MVC如何返回一个非JSP文件名字的地址
return new ModelAndView("redirect:/bizitem/goEditItem.do?item_id="+item_id+"&msg= ...
- [物理学与PDEs]第3章习题1 只有一个非零分量的磁场
设磁场 ${\bf H}$ 只有一个非零分量, 试证明 $$\bex ({\bf H}\cdot\n){\bf H}={\bf 0}. \eex$$ 证明: 不妨设 ${\bf H}=(0,0,H_3 ...
随机推荐
- text-overflow 文字溢出时的设置
text-overflow : clip | ellipsis clip: 不显示省略标记(...),而是简单的裁切. ellipsis: 当对象内文本溢出时显示省略标记(...) 设置或检索是否使用 ...
- org.springframework.dao.EmptyResultDataAccessException
public Wcrash getWcrashInfo(int id) { String sql = "select plateform_id,android_version,app_ver ...
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2
/** * 百度地图使用工具类-v1.5 * * @author boonya * @date 2013-7-7 * @address Chengdu,Sichuan,China * @email b ...
- HOWTO Use Python in the web — Python v3.0.1 documentation
HOWTO Use Python in the web - Python v3.0.1 documentation mod_python¶ People coming from PHP often f ...
- Java根据年份算出所属的生肖。
一个小程序~ public String getYear(Integer year){ if(year<1900){ return "未知"; } Integer start ...
- Android学习总结——SQLite
SQLiteDatabase类: 一.使用sql语句操作数据库 SQLiteDatabase db = openOrCreateDatabase("database.db", MO ...
- ACdream OJ 1153 (k-GCD)
题目链接: http://115.28.76.232/problem?pid=1153 题意: 从给定的n个数中取出k个数,使得他们的最大公约数最大,求这个最大的公约数 分析: 暴力分解不可取,我们能 ...
- java基础之集合List-ArrayList、LinkedList、Vector的差别
PS:本篇博客主要參考jdk的底层源代码.而非自己动手写代码. 请问ArrayList.LinkedList.Vector的差别 ①ArrayList底层实际上是採用数组实现的(而且该数组的类型的Ob ...
- Unity 4.6 uGUI的点击事件
因为Unity 4.6刚刚发布,自带的uGUI功能的相关资料还不是很完善,今天刚装的Unity 4.6,想看一下uGUI是否好用,那么开始就今天的学习吧啊! 1,新建一个空的工程.
- CATransform3D参数的意义
经常忘记CATransform3D各参数的意思,记下来好好理解下 struct CATransform3D { CGFloat m11(x缩放),m12(y切变),m13(旋转),m14(); C ...