44 votes

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

Je veux avoir cette fonction dans mon programme C#: Lorsque l'utilisateur de faire Ctrl+C ou Copier n'importe où (c'est à dire lorsque le contenu du presse-papiers changements), mon programme sera notifié, et de vérifier si le contenu respecte certains critères, le cas échéant, devenir le programme actif, et le contenu, etc.

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

Cheers,

EDIT: Si vous utilisez Vista ou version ultérieure, utilisez AddClipboardFormatListener comme dans Jean Knoeller réponse, pour XP, il faut utiliser les plus anciens, les plus fragiles SetClipboardViewer API, comme dans la accepté de répondre.

56voto

Justin Points 42106

J'ai écrit un petit utilitaire de la classe qui utilise la AddClipboardFormatListener fonction fonction avec un Message d'seule fenêtre pour faire juste cela.

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

Cette classe suppose que les notifications sont toujours nécessaires pour la durée de la durée de vie des applications, cependant, il pourrait être modifié pour prévoir la possibilité de vous désinscrire via le RemoveClipboardFormatListener fonction si nécessaire.

16voto

John Knoeller Points 20754

Vous pouvez le faire avec pinvoke à l'API Win32 AddClipboardFormatListener

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

Il s'agit d'un remplacement plus robuste pour l'ancienne API SetClipboardViewer .

3voto

µBio Points 6959

L'API Win32 contient une fonction SetClipboardViewer.

Voici une très bonne écriture (d'un coup d'œil).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X