用C++Builder设计剪贴板查看器

软件世界

我们知道,Windows系统中自带了一个剪贴板查看器,它能够实时地监视剪贴板,如果我们能够在自己的程序中实现这个功能,肯定为我们的程序增色不少。
那么它到底是如何实现的呢?我们只要把自己的程序注册成为剪贴板查看器(即加入剪贴板查看链表中)即可实现该功能。下面笔者以C++ Builder 5.0为例编程说明其具体实现过程。
首先新建一个工程,在Form1上增加一个Memo控件,然后在Form1的.h里面加上#include ,因为下面要用到的API函数大多是在该头文件中定义的。
在Form1的.h的public加上:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWCLIPBOARD,TMessage,ClipboardChanged) //映射这个消息
END_MESSAGE_MAP(TForm)
HWND LastHandle; //用于保存剪贴板查看器链中下一个窗口的句柄。
接下来,当然是把自己的程序窗口注册成为剪贴板查看器了。在Form1的OnCreate事件中加入一句:
LastHandle=SetClipboardViewer(Form1->Handle);
该函数会将指定的窗口加入剪贴板查看器链,参数handle就是你欲新加入的窗口的句柄,返回值则为系统的剪贴板查看器链中下一个窗口的句柄。
当你自己的程序退出时,必须从剪贴板查看器链中删除本窗口。在Form1的OnClose事件中加入两句:
ChangeClipboardChain(Form1->Handle,LastHandle);
函数ChangeClipboardChain是SetClipboardViewer的逆操作,能将第一个参数handle指定的窗口从剪贴板查看器链中删除,第二个参数是剪贴板查看器链中下一个窗口的句柄,是供系统调整剪贴板查看器链表用的,我们不用管它。
最后一步,也是最关键的一步,如果剪贴板内容有变化,窗口将自动激活WM_DRAWCLIPBOARD消息,也即间接地实现了让剪贴板向自己的程序发消息的功能,这就能够实时监视剪贴板,相信网络蚂蚁也应该是用这个方法。有一点要注意的是,在接收处理WM_DRAWCLIPBOARD消息时要将消息传递给剪贴板查看链中的下一个窗口,以便让其他程序也能监视剪贴板。因为该消息只直接发给链中的第一个程序,其他程序不会直接收到该消息。
程序如下,在Form1的.h的private加上:
void _fastcall ClipboardChanged(TMessage& Msg);
再编写自己的处理过程,这就是你自由发挥的地方了。本例设为自动将剪贴板的文本粘贴到Memo控件中。
在Form1的.cpp内加上:
void__fastcall TForm1::ClipboardChanged(TMessage& Msg)
{if(Clipboard()->HasFormat(CF_TEXT))
Memo1->Text = Clipboard()->AsText;}
这一过程中使用了TClipboard类的Clipboard函数获取剪贴板内文本内容。至于如何获取剪贴板内的其他非文本类型的内容则不在本文讨论范围内了,读者可自己在C++ Builder中输入TClipboard,再按F1键,就可以看到各个函数的详细用法了。
注:以上程序在C++ Builder 5.0、Win98系统下调试通过。