1. 程式人生 > >WIN7下使用.net(C#)監視剪貼簿

WIN7下使用.net(C#)監視剪貼簿

最近需要做一個小程式,需要常駐後臺,監視剪貼簿變化並提取內容,
在網上查了一些資料,先採用SetClipboardViewer方法實現,具體原理可以參考http://www.cnblogs.com/jht/archive/2006/03/20/354088.html,我的程式中使用的是http://code.google.com/p/clipboardviewer/提供的ClipboardChangeNotifier.cs類,比較方便,類程式碼見附件(在google code中下載或http://www.kuaipan.com.cn/file/id_22823997376823393.htm),使用方法為:
主窗體初始化時:
    ClipboardChangeNotifier clipChange = new ClipboardChangeNotifier();
    clipChange.ClipboardChanged += new EventHandler(clipChange_ClipboardChanged);
    clipChange.AssignHandle(this.Handle);
    clipChange.Install();
主窗體退出時:
    clipChange.Uninstall();


    
此程式在XP下執行正常,但是後來在WIN7下使用時遇到了一些問題,經常會在螢幕保護程式或系統休眠後,不再實時監視剪貼簿,具體原因不明,後來查了下資料,有人提到SetClipboardViewer函式在Vista以上版本工作並不是很穩定,建議使用AddClipboardFormatListener這個新的API函式,MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/ms649033%28v=vs.85%29.aspx)上提到該API函式只能用於Vista及以上版本,經測試,程式工作正常

程式碼比SetClipboardViewer方法簡單:
首先宣告API函式
    [DllImport("user32.dll")]
        public static extern bool AddClipboardFormatListener(IntPtr hwnd);

        [DllImport("user32.dll")]
        public static extern bool RemoveClipboardFormatListener(IntPtr hwnd);

        private static int WM_CLIPBOARDUPDATE = 0x031D;

窗體初始化時新增對剪貼簿的監視:  
 AddClipboardFormatListener(this.Handle);

窗體關閉時移除對剪貼簿的監視:
  RemoveClipboardFormatListener(this.Handle);



接收到剪貼簿更新的訊息時,讀取剪貼簿內容:
    protected override void DefWndProc(ref Message m)
        {
            if (m.Msg == WM_CLIPBOARDUPDATE)
            {
                UpdateClipValueList();
            }
            else
            {
                base.DefWndProc(ref m);
            }
        }