怎么让一个非窗口组件可以接受来自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 ...
随机推荐
- position属性absolute与relative(转)
每次要用到Position属性时,总要去搜索下,这两个属性值的区别:今天就直接复制网上的结果,以便以后多看看. Absolute,CSS中的写法是:position:absolute; 他的意思是绝对 ...
- GitHub好站点
https://github.com/XingCloud/stream_processor
- 【MVC4 之 ViewData ViewBag TempData】
ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. V ...
- codecomb 2091【路径数量】
好久没有更新博客了啊……屯了一堆题没发呢 这是丧心病狂的hzwer每日NOI模拟赛第一天的第一题 妈蛋说好的NOIP难度图论算法两题网络流!让我说什么好 唔……codecomb的页面在晚上就会变得很奇 ...
- Php环境下载(PHPNow)安装
下载 From http://servkit.org/download 安装 解压下载包,双击setup.cmd,按照提示执行安装. 安装成功测试 原来的解压目录
- 完全跨站点跨域名单点(SSO)同步登录和注销
先来说说什么是单点登录(SSO).来自百科的介绍:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主 ...
- UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm & String<Problem L>
L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others) Memory Limit: 43000/43000KB (Java/ ...
- POJ3268 Silver Cow Party(dijkstra+矩阵转置)
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15156 Accepted: 6843 ...
- go 学习笔记 - sublime text 环境配置
园里已经有了一篇相当不错的配置说明文章,只是现在gosublime不再支持2.x.文章里的操作在sublimetext3 里一样可以使用 文章地址 : http://www.cnblogs.com/s ...
- Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)
Samsung K9F1G08U0D,数据存储容量为128M,采用块页式存储管理.8个I/O引脚充当数据.地址.命令的复用端口.详细:http://www.linux-mtd.infradead.o ...