2024年4月28日发(作者:)

您正在看的VC教程是:在应用程序中监视剪贴板的变化和内容。

剪贴板是Windows中系统级的堆空间,系统中任何一个应用程序对剪贴板都有访问权,可

以通过剪贴板消息和使用剪贴板API来读写剪贴板内容。因此使用剪贴板不仅可以在同一

个应用程序内交互数据,也可以在不通应用程序之间交互数据。尤其是在不通应用程序之间

交互时,应用程序往往需要对剪贴板内容的变化做到实时感知,即应用程序要能监视剪贴板

内容的变化。

Windows应用是消息驱动的,同理当剪贴板内容发生变化时,Windows提供了剪贴板变化

消息,因此要实时感知剪贴板内容的变化,关键是应用程序要能响应和处理Windows触发

的剪贴板变化消息。

第一步,要将窗口注册为Clipboard Viewer

需要首先解释两个概念:Clipboard Viewer和Clipboard Viewer Chain。

Clipboard Viewer是一个需要取得并显示剪贴板内容的窗口,通过Clipboard Viewer这个机

制,应用程序可以在不影响剪贴板内容的情况下获取剪贴板的变化消息。Clipboard Viewer

可以显示系统定义的标准格式的剪贴板内容,也可以显示应用自定义的私有数据格式的内

容。通过调用函数SetClipboardViewer将窗口注册为Clipboard Viewer。

Clipboard Viewer Chain是保存Clipboard Viewer窗口以及他们之间的前后向关系的一个

Windows系统链表,当一个窗口注册为Clipboard Viewer后,他会被加入Clipboard Viewer

Chain,并得到链表中下一个Viewer窗口的句柄,该句柄必须保存以在响应消息时使用,该

句柄的作用在下文说明。Windows正是通过Clipboard Viewer Chain保证了所有Clipboard

Viewer能接收和响应剪贴板变化消息。

第二步,响应剪贴板变化消息,判断和取出剪贴板内容

在消息响应里必须正确处理两个消息:WM_DRAWCLIPBOARD和

WM_CHANGECBCHAIN。

当剪贴板内容发生变化时,Windows将触发WM_DRAWCLIPBOARD消息,并将该消息送

给Clipboard Viewer Chain的第一个窗口。每一个Clipboard Viewer窗口,包括第一个窗口在

响应和处理该消息后,必须根据其保存的链表中的下一个窗口的句柄将该消息发送给下一个

Clipboard Viewer窗口。窗口可以在该消息中取出剪贴板内容,并判断是否是该窗口增在监

视的内容,如果是就进行相应的处理。

当某个Clipboard Viewer窗口注销时,系统将触发WM_CHANGECBCHAIN,并将该消息送

给Clipboard Viewer Chain的第一个窗口。每一个窗口必须处理该消息。

第三步,将窗口从Clipboard Viewer Chain中注销

当窗口不再需要监视剪贴板变化消息,或窗口要关闭时,必须调用ChangeClipboardChain

函数将窗口从Clipboard Viewer Chain中注销。注销后系统会触发WM_CHANGECBCHAIN

消息,同WM_DRAWCLIPBOARD消息一样,该消息会给发送给Clipboard Viewer Chain的

第一个窗口处理。下面代码示例当窗口被关闭时进行注销。

下面的代码片断给出了监视剪贴板中是否拷贝了URL地址的例子,如果剪贴板中的内容是

URL地址,则将其显示在窗口界面上。为使示例代码具有一般性,下面给出了一般Windows

程序代码和基于MFC的代代码。其他语言要实现该功能可以参考Windows程序代码。两个

DEMO的完成代码请见附件。

Windows程序示例代码

Windows程序示例代码

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

unsigned int anFormats[] = {CF_TEXT};

unsigned int nFormat;