简介
这是一个简单的WinForm组件和WinForm程序,它可以实时的监控用户对Windows剪贴板的操作。当用户复制/剪切时,它会自动记录用户复制/剪切的内容。这个程序使用组件来完成,所以你可以很方便的在自己的程序中使用剪贴板监控组件。当然,目前这个组件很小很简单,功能还不完善。
使用Win32 API
我们使用Windows API 来注册我们的程序,使得操作系统会在用户复制/剪切时通知我们的程序。需要使用一下几个函数:
·SetClipboardViewer() - 使一个窗口加入到Windows剪贴板监听者链中。这样在用户扶智/剪切时,Windows会给我们的窗口发送一个WM_DRAWCLIPBOARD消息。而且,当有其他程序加入/退出这个监听者链表时,Windows会给我们的窗口发送一个WM_CHANGECBCHAIN 消息。注意:当自己的窗口接收到这两个消息时,应该使用SendMessage函数来把消息传送给下一个监听者。
·ChangeClipboardChain() - 使一个窗口退出Windows剪贴板监听者链。注意我们的程序必须调用ChangeClipboardChain函数来退出监听者链表。
·SendMessage() - 发送消息到其他窗口,以便于Windows剪贴板监听者链表中消息的传递。
重写WndProc方法
重写自己的WndProc方法,以接收Windows消息。当接收到WM_DRAWCLIPBOARD消息时,首先要记得把消息传送给下一个监听者。然后就可以处理自己的程序,这里我们只是触发一个简单的事件,把事情交给更高一层来处理。当接收WM_CHANGECBCHAIN时,需要改变监听者链表。并且记着还要发送消息给下一个监听者。
protected override void WndProc(ref Message m)
{
switch ((Msgs)m.Msg)
{
case Msgs.WM_DRAWCLIPBOARD:
if (m_onWork)
{
Win32.SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);
if (ClipboardDrawn != null)
ClipboardDrawn(this, new ClipboardDrawnEventArgs("Good"));
}
break;
case Msgs.WM_CHANGECBCHAIN:
if (m.WParam == ClipboardViewerNext)
{
ClipboardViewerNext = m.LParam;
}
else
{
Win32.SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);
}
break;
default:
break;
}
base.WndProc(ref m);
}
使用组件
为了让客户程序更简单的使用我们的代码,我们把我们的代码做成一个组件。在Visual Studio中新建一个集成自Component的组件,并添加代码,这样子其他程序使用我们的类库时,开发人员只需要简单在设计器上拖动我们的组件,然后在属性框中简单的设置,就可以使用了。
注意,这里有一个问题。Windows消息只能被窗口接收(这里是窗口不是窗体),包括System.Windows.Forms.Control及集成自Control的类,比如Form等。但是Component并不在这个范围内,所以严格来说Component是不能收到Windows消息的。所以我这里采用了一个小办法,把所有代码写在一个自定义Control类中,然后再用Component简单的包装了一层。
还有一些自定义的委托、事件和事件参数,用来使我们的组件产生事件。
其他相关
这个程序参考了Mike Hankey的ClipSpy+,这个程序写的很好,但是好像不是很方别别人使用代码。
附件
演示程序 /Files/flankerfc/200801003/ClipManager_bin.zip
源代码 /Files/flankerfc/200801003/ClipManager_src.zip