如何监视C#中的剪贴板内容更改?
我想在我的C#程序中使用这个function:当用户按Ctrl + C或任意位置复制(即剪贴板内容改变时),我的程序会收到通知,并检查内容是否符合某些标准,如果是,则成为活动程序,处理内容等。
我可以从System.Windows.Forms.Clipboard
获取内容,但是,我不知道如何监视剪贴板中的内容更改。
如果使用Windows Vista或更高版本,请使用AddClipboardFormatListener
如John Knoeller的答案中所述),对于Windows XP,我必须使用旧的,更脆弱的SetClipboardViewer
API,如同接受的答案。
你可以使用win32 API提供的SetClipboardViewer (通过p / invoke)。
这是一个包含代码的页面,用C#来设置: http : //www.codeguru.com/csharp/.net/net_general/tipstricks/article.php/c7315/
我已经写了一个小的实用程序类,使用AddClipboardFormatListener函数函数与消息窗口来做到这一点。
/// <summary> /// Provides notifications when the contents of the clipboard is updated. /// </summary> public sealed class ClipboardNotification { /// <summary> /// Occurs when the contents of the clipboard is updated. /// </summary> public static event EventHandler ClipboardUpdate; private static NotificationForm _form = new NotificationForm(); /// <summary> /// Raises the <see cref="ClipboardUpdate"/> event. /// </summary> /// <param name="e">Event arguments for the event.</param> private static void OnClipboardUpdate(EventArgs e) { var handler = ClipboardUpdate; if (handler != null) { handler(null, e); } } /// <summary> /// Hidden form to recieve the WM_CLIPBOARDUPDATE message. /// </summary> private class NotificationForm : Form { public NotificationForm() { NativeMethods.SetParent(Handle, NativeMethods.HWND_MESSAGE); NativeMethods.AddClipboardFormatListener(Handle); } protected override void WndProc(ref Message m) { if (m.Msg == NativeMethods.WM_CLIPBOARDUPDATE) { OnClipboardUpdate(null); } base.WndProc(ref m); } } } internal static class NativeMethods { // See http://msdn.microsoft.com/en-us/library/ms649021%28v=vs.85%29.aspx public const int WM_CLIPBOARDUPDATE = 0x031D; public static IntPtr HWND_MESSAGE = new IntPtr(-3); // See http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool AddClipboardFormatListener(IntPtr hwnd); // See http://msdn.microsoft.com/en-us/library/ms633541%28v=vs.85%29.aspx // See http://msdn.microsoft.com/en-us/library/ms649033%28VS.85%29.aspx [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); }
该类假定通知在应用程序生存期内始终是需要的,但是如果需要,可以通过RemoveClipboardFormatListener函数修改它以提供取消订阅的function 。
您可以使用Win32 API的AddClipboardFormatListener来完成此操作
监听器是一个窗口句柄(Form.Handle),表单将被通知WM_CLIPBOARDUPDATE通知
这是更老的SetClipboardViewer
API的更强大的替代品。
Win32 API包含一个函数SetClipboardViewer。
这是一个很好的(从快速浏览)写出来。