flanker base @ cnblogs

defy all challenges & accelerate your life

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

简介



这是一个简单的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(
thisnew 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 HankeyClipSpy+,这个程序写的很好,但是好像不是很方别别人使用代码。

附件

演示程序 /Files/flankerfc/200801003/ClipManager_bin.zip
源代码 /Files/flankerfc/200801003/ClipManager_src.zip

posted on 2008-01-18 00:14  flankerfc  阅读(3275)  评论(1编辑  收藏  举报