¿Cómo controlo el contenido del portapapeles cambia en C #?

Quiero tener esta característica en mi progtwig C #: cuando el usuario hace Ctrl + C o Copia en cualquier lugar (es decir, cuando cambia el contenido del portapapeles), mi progtwig recibirá una notificación y verificará si el contenido cumple ciertos criterios; si es así, conviértase en progtwig activo, y procesar el contenido, etc.

Puedo obtener los contenidos de System.Windows.Forms.Clipboard , sin embargo, no sé cómo supervisar los cambios de contenido desde el portapapeles.

Si usa Windows Vista o posterior, use AddClipboardFormatListener como en la respuesta de John Knoeller, para Windows XP, tengo que usar la API SetClipboardViewer más antigua y más frágil, como en la respuesta aceptada.

Puede usar SetClipboardViewer provisto por win32 API (a través de p / invoke).

Aquí hay una página que contiene el código para configurar uno en C #: http://www.codeguru.com/csharp/.net/net_general/tipstricks/article.php/c7315/

Escribí una pequeña clase de utilidad que usa la función de función AddClipboardFormatListener con una ventana de solo mensaje para hacer esto.

 ///  /// Provides notifications when the contents of the clipboard is updated. ///  public sealed class ClipboardNotification { ///  /// Occurs when the contents of the clipboard is updated. ///  public static event EventHandler ClipboardUpdate; private static NotificationForm _form = new NotificationForm(); ///  /// Raises the  event. ///  /// Event arguments for the event. private static void OnClipboardUpdate(EventArgs e) { var handler = ClipboardUpdate; if (handler != null) { handler(null, e); } } ///  /// Hidden form to recieve the WM_CLIPBOARDUPDATE message. ///  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); } 

Esta clase asume que las notificaciones siempre son necesarias durante la vida útil de las aplicaciones, sin embargo, se podría modificar para proporcionar la posibilidad de anular la suscripción a través de la función RemoveClipboardFormatListener si es necesario.

Puede hacer esto con pinvoke en la API de Win32 AddClipboardFormatListener

El oyente es un identificador de ventana (Form.Handle) y se notificarán los cambios al formulario con una notificación WM_CLIPBOARDUPDATE

Es un reemplazo más robusto para la API más antigua de SetClipboardViewer .

La API de Win32 contiene una función SetClipboardViewer.

Aquí hay una muy buena (de un vistazo rápido) escribir.