Windows系统的消息机制
1)Add the window to the clipboard viewer chain.
通过SetClipboardViewer()传入窗口句柄,所有监视剪贴板的窗口句柄会组成一个链表(后来者靠前)。这样当剪贴板内容发生变化时,Windows系统给这些窗口发生消息。剪贴板是系统的一个功能。每个系统功能都有一个消息链。用户程序想要使用某个系统功能,首先是把自己的程序窗口注册到指定功能的消息链上。如果把一个系统功能理解一个设备,就象Windows对文件或者设备都用处理函数。系统中的每个设备都有自己相应的功能。每一个系统的行为都要告诉给需要这个设备的程序。谁需要知道这个知道的行为呢?想要知道这个设备当前行为或者状态的程序容器就要先将自己登记到这个设备的消息链表中。
每个设备只给已经登记在自己的消息链表中的程序窗口发送消息,表明设备当前的状态或者行为。消息只发给自己消息链中的程序,这个很好理解。把自身行为状态的消息发给不关心这个设备的程序窗口,显然没有任何的意义。从这里可以知道。Windows消息必然有两种,一种是发给指定对象,一种是发给全体所有。从用户的角度来说,就是发给所有需要的用户,或者发给全部的用户。
2)Remove the window from the clipboard viewer chain before itis destroyed.
首先是登记,将用户的程序窗口登记到某个功能或者设备的消息链表中。与登记对应的操作就是注销。程序窗口已经不需要了解设备或者功能的行为状态时,就要将自己从设备的消息链中删除。与登记过程SetClipboardViewer()对应的注销过程ChangeClipboardChain()。需要了解某个系统功能或者设备的时候,就要将自己的程序窗口登记到设备的消息链中。不再需要知道设备的行为状态时,就要从设备的消息链中把自己的程序窗口删除掉。
3)互动
为什么要登记?因为想要了解系统某个功能或者设备的行为状态。为什么要注销,因为不再关心指定设备或者某个系统功能的行为状态。在登记与注销的过程之间也就是响应。登记是为了掌握系统设备的某个状态或者行为,并在自己的程序窗口对其做出反映。也就是说当系统设备达到某个状态时,用户的程序窗口要有一些行为或者动作与之发生互动。实际上对于消息的发送与接收,就是发送者与接收者之间的互动。首先是彼此建立联系,然后在某一个特定的时间或者行为或者状态下进行交流,最后结束联系恢复到初始的状态。这样说来初始的状态是没有联系的吗?也不是。初始的状态并非完全的没有联系。
所谓初始的状态是具有联系机制,也即消息发送与接收,消息链的登记与注销,这些做为联系的机制或者方法或者原则已经建立起来了。做为用户的程序窗口什么时候使用这些机制实现具体的功能,这就要由用户自身来决定。不同的程序开发环境必然提供了不同的方法与系统的消息互动。不过,做为编程环境会有万千的变化,做为系统确只有一定之规。
4)消息链
用户的程序窗口在将自身登记到消息链中时,是不需要关注消息链的结构变化。这个过程是由系统来完成。问题在于当用户的程序窗口从消息链中退出的时候。每一个程序窗口从消息链退出的时候,消息链的结构都要发生变化。这个时候维护消息链的工作就要有谁来完成呢?一方面是系统自己维护消息链的增减变化,一方面由用户的程序窗口维护消息链的退出行为。那么维护消息链的工作究竟是由系统来完成,还是由用户自己的程序窗口来完成?具体的系统功能或者设备,提供的消息与服务都是不同的,这就要根据实际情况具体的分析。
//以下内容在C++Builder编程环境下可用
1 class TForm1 : public TForm
2 {
3 public: // User declarations
5 HWND NextViewerHandle;
6 void __fastcall OnWMDrawClipboard(TMessage &Msg);
7 void __fastcall OnWMChagecbchain(TMessage &Msg);
8 BEGIN_MESSAGE_MAP
9 VCL_MESSAGE_HANDLER(WM_DRAWCLIPBOARD,TMessage,OnWMDrawClipboard);
10 VCL_MESSAGE_HANDLER(WM_CHANGECBCHAIN,TMessage,OnWMChagecbchain);
11 END_MESSAGE_MAP(TForm)
12 }
13
14 //1)登记消息链
15 void __fastcall TForm1::FormCreate(TObject *Sender)
16 {
17 NextViewerHandle = SetClipboardViewer(Handle);
18 }
19 //2)注销消息链
20 void __fastcall TForm1::FormDestroy(TObject *Sender)
21 {
22 ChangeClipboardChain (Handle, NextViewerHandle);
23 }
24 //3)消息处理
25 void __fastcall TForm1::OnWMDrawClipboard(TMessage &Msg)
26 {
27 if(NextViewerHandle != NULL )
28 {
29 SendMessage(NextViewerHandle,Msg.Msg,0,0);
30 }
31 //{写入用户自己的代码}
32 }
33
//4)维护消息链的结构
34 void __fastcall TForm1::OnWMChagecbchain(TMessage &Msg)
35 {
36 if((HWND) Msg.WParam == NextViewerHandle)
37 {
38 NextViewerHandle = (HWND)Msg.LParam;
39 }
40 else if(NextViewerHandle != NULL)
41 {
42 SendMessage(NextViewerHandle, Msg.Msg, Msg.WParam, Msg.LParam);
43 }
44 }
Windows系统的消息机制的更多相关文章
- Windows程序设计2(消息机制、菜单)
一 .小记; PostQuitMessage(0); 产生WM_QUIT消息给进程队列,且立即返回,同时使得消息循环退出,使得进程终止.(其实它通过PostMessage(hWnd,WM_QUIT,0 ...
- Windows消息机制(转)1
Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是总是在某个线程(Thread)内创建的.Windows系统通过消息机制来管理交互,消息(Message ...
- 收藏:Windows消息机制
百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...
- 深入Delphi -- Windows 消息机制
http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...
- windows消息机制与实例
windows发送窗口消息 所需工具:spy++,visual studio 2017,c#语言 技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为: [DllImport(&qu ...
- Windows 消息机制浅析
1. Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...
- Windows 消息机制详解
总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置 关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...
- java:从消息机制谈到观察者模式
从简单的例子开始 同样,我们还是先看一个简单例子:创建一个窗口实现加法的计算功能.其效果如下: 图1: 加法计算 Calculator.java: import javax.swing.*; impo ...
- Windows内核读书笔记——Windows异常分发处理机制
本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...
随机推荐
- Git-工作区和暂存区的概念
工作区(Working Directory):就是在电脑里能看到的目录,如testcase文件夹就是一个工作区. 版本库(Repository):工作区有一个隐藏目录.git,是Git的版本库. ...
- CentOS 安装Weblogic并配置 domain
CentOS 安装Weblogic并配置 domain 1.创建用户组 [root@localhost weblogic]# groupadd weblogic 2.创建 tmn 用户 [root@l ...
- [原创]Base32加密解密工具
工具: Base32_Decode编译: VS2012 C# (.NET Framework v2.0)组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8. ...
- Node.js中的模块接口module.exports浅析
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...
- BIND DNS拒绝服务漏洞 CVE-2016-2776修复
接到此漏洞之后,略微查了一下相关描述,发现漏洞影响范围很大,可能造成的影响也很严重,于是着手进行修复. 漏洞的详细信息可见如下链接: http://www.cnvd.org.cn/flaw/show/ ...
- hive中解决中文乱码
一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为 j ...
- Python:使用异常处理来判断运行的平台
try: import termios, TERMIOS 1 except ImportError: try: import msvcrt 2 except ImportError: try: fro ...
- npm 安装 cannot find module
window7安装module出现 Connot find module 'xxx' 解决办法: 添加环境变量命名为:NODE_PATH 设置值为:%AppData%\npm\node_modules ...
- ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 2
这是sqoop的 迁移数据到hive的报错 解决方案: 1,已经尝试不是 晚上大多数说的 libthrity的原因 2,查看自己的配置 sqoop-env.sh 如果配置的路径写的不对,对应的包 ...
- scala-04-set操作
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的. Scala 集合分为可变的和不可变的集合. 默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scal ...