Comment surveiller les modifications du contenu du presse-papiers en C #?

Je veux avoir cette fonctionnalité dans mon programme C #: Lorsque l’utilisateur fait Ctrl + C ou Copier n’importe où (c.-à-d. Lorsque le contenu du presse-papiers change), mon programme sera notifié et vérifiera si le contenu répond à certains critères. programme actif, et traiter le contenu, etc.

Je peux obtenir le contenu de System.Windows.Forms.Clipboard , cependant, je ne sais pas comment surveiller les modifications de contenu à partir du presse-papiers.

Si vous utilisez Windows Vista ou une version ultérieure, utilisez AddClipboardFormatListener comme dans la réponse de John Knoeller. Pour Windows XP, je dois utiliser l’API SetClipboardViewer , plus ancienne et plus fragile, comme dans la réponse acceptée.

Vous pouvez utiliser SetClipboardViewer fourni par l’API Win32 (via p / invoke).

Voici une page qui contient du code pour en créer un dans C #: http://www.codeguru.com/csharp/.net/net_general/tipssortingcks/article.php/c7315/

J’ai écrit une petite classe utilitaire qui utilise la fonction AddClipboardFormatListener avec une fenêtre Message-only pour ce faire.

 ///  /// 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); } 

Cette classe suppose que les notifications sont toujours nécessaires pour la durée de la durée de vie des applications, mais elle pourrait être modifiée pour permettre de se désabonner via la fonction RemoveClipboardFormatListener si nécessaire.

Vous pouvez faire cela avec pinvoke à l’API Win32 AddClipboardFormatListener

L’écouteur est un handle de fenêtre (Form.Handle) et le formulaire sera notifié des modifications avec une notification WM_CLIPBOARDUPDATE

C’est un remplacement plus robuste de l’ancienne API SetClipboardViewer .

L’API Win32 contient une fonction SetClipboardViewer.

Voici un très bon article (d’un coup d’œil rapide).