WIN7下使用.net(C#)監視剪貼簿
阿新 • • 發佈:2019-02-11
最近需要做一個小程式,需要常駐後臺,監視剪貼簿變化並提取內容,
在網上查了一些資料,先採用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),使用方法為:
主窗體初始化時:
此程式在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函式
窗體初始化時新增對剪貼簿的監視:
窗體關閉時移除對剪貼簿的監視:
接收到剪貼簿更新的訊息時,讀取剪貼簿內容:
在網上查了一些資料,先採用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); } }