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系统的消息机制的更多相关文章

  1. Windows程序设计2(消息机制、菜单)

    一 .小记; PostQuitMessage(0); 产生WM_QUIT消息给进程队列,且立即返回,同时使得消息循环退出,使得进程终止.(其实它通过PostMessage(hWnd,WM_QUIT,0 ...

  2. Windows消息机制(转)1

    Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是总是在某个线程(Thread)内创建的.Windows系统通过消息机制来管理交互,消息(Message ...

  3. 收藏:Windows消息机制

    百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...

  4. 深入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 ...

  5. windows消息机制与实例

    windows发送窗口消息 所需工具:spy++,visual studio 2017,c#语言 技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为: [DllImport(&qu ...

  6. Windows 消息机制浅析

    1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...

  7. Windows 消息机制详解

    总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置   关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...

  8. java:从消息机制谈到观察者模式

    从简单的例子开始 同样,我们还是先看一个简单例子:创建一个窗口实现加法的计算功能.其效果如下: 图1: 加法计算 Calculator.java: import javax.swing.*; impo ...

  9. Windows内核读书笔记——Windows异常分发处理机制

    本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...

随机推荐

  1. 通过javascript 直接播放amr格式的语言

    前段时间做了个功能(有2.3个月了,突然想起来了,就记录一下),语言播放.一开始觉得很简单~~~ 计划应用的是H5的audio标签,但因为这个标签不支持amr格式的语言,但是手机端传到后台的录音却都是 ...

  2. 简单的C# Socket通信实例

    一.套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本 ...

  3. [宁波集训]0827Day1

    1.\(CF771D\ Bear\ and\ Company\)(原题,比赛时改为多组数据) 一道毒瘤\(dp\)题,\(dp[i][j][k][0/1]\)表示有\(i\)个\(V\),有\(j\) ...

  4. Swift5 语言参考(四) 表达式

    在Swift中,有四种表达式:前缀表达式,二进制表达式,主表达式和后缀表达式.评估表达式会返回一个值,导致副作用,或两者兼而有之. 前缀和二进制表达式允许您将运算符应用于较小的表达式.主要表达式在概念 ...

  5. 基于cytoscape.js 、 d3.js实现的关系图谱初级版本

    前面的文章已经介绍了cytoscape.js . d3.js的安装及简单demo,现在展示从html页面转移到vue项目下的最初版的demo 效果图: 代码如下: <template> & ...

  6. 推荐一个 MYSQL 的命令行的客户端 MYCLI

    MYCLI 是一个 MySQL 命令行客户端工具 , 可以实现自动补全(auto-completion)和语法高亮,平时测试环境维护一些数据还是蛮方便的. https://github.com/dbc ...

  7. 全网最详细的Windows系统里PLSQL Developer 64bit的下载与安装过程(图文详解)

    不多说,直接上干货! ORACLE是数据库,有客户端和服务器: 其,具体下载,可见http://www.oracle.com/technetwork/database/enterprise-editi ...

  8. windows平台,实现录音功能详解

    音频处理分为播放和录音两类.对这些处理,微软提供了一些列函数,称之为Waveform Functions.这篇文章讨论录音功能.会对微软提供的函数做简单说明,并对这些函数封装成c++类,再进一步封装成 ...

  9. Linux安装codis

    codis用go语言开发的,安装前记得先安装go开发环境,Linux安装go语言开发包 前提条件:记得安装git,否则无法下载go语言开发包 1.建立一个go语言的工作目录创建目录:sudo mkdi ...

  10. CentOS 7下搭配简单的C语言开发环境

    在CentOS 7下安装gcc,gcc是编译和运行C语言的工具, 安装命令: yum install gcc 中途如果有询问则输入y 安装成功后,通过以下命令 gcc --version 来查看安装的 ...