在应用程序中监视剪贴板的变化和内容

Eddy 发布于2009-11-5 19:26:57 分类: 程序设计 已浏览loading 网友评论0条 我要评论

剪贴板是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的第一个窗口处理。

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/program/68.html     欢迎订阅Eddy Blog

关于 剪贴板  监视  SetClipboardViewer  的相关文章

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言