Maison >développement back-end >C++ >Comment puis-je détecter les modifications du Presse-papiers en C# ?

Comment puis-je détecter les modifications du Presse-papiers en C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-22 21:16:15911parcourir

How Can I Detect Clipboard Changes in C#?

Surveillance du presse-papiers en temps réel avec C#

Cet article montre comment créer une application C# qui surveille efficacement les modifications du presse-papiers. Le défi réside dans la détection du moment où le contenu du presse-papiers est mis à jour.

Solution :

L'utilisation de la gestion des messages Windows fournit une solution robuste. Cela implique :

  1. Contrôle personnalisé : Un contrôle personnalisé, héritant de Control (et non de Component), est crucial pour obtenir un handle de fenêtre. Ce handle est nécessaire pour interagir avec la file d'attente de messages Windows.

  2. WndProc Override : La méthode WndProc intercepte les messages Windows. Nous ciblons spécifiquement WM_DRAWCLIPBOARD.

  3. WM_DRAWCLIPBOARD Manipulation : Ce message signale une mise à jour du presse-papiers. Dans la méthode WndProc, lorsque WM_DRAWCLIPBOARD est reçu, la méthode OnClipboardChanged est invoquée.

  4. Récupération de données : OnClipboardChanged utilise Clipboard.GetDataObject() pour récupérer les données mises à jour du presse-papiers.

  5. Déclencheur d'événement : Enfin, un événement ClipboardChanged personnalisé est déclenché, transmettant les nouvelles données.

Voici un exemple de code illustrant le contrôle de surveillance du presse-papiers :

<code class="language-csharp">using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;

namespace ClipboardMonitorApp
{
    [DefaultEvent("ClipboardChanged")]
    public class ClipboardMonitor : Control
    {
        private IntPtr nextClipboardViewer;

        public ClipboardMonitor()
        {
            this.BackColor = Color.Red;
            this.Visible = false;
            nextClipboardViewer = SetClipboardViewer((int)this.Handle);
        }

        public event EventHandler<ClipboardChangedEventArgs> ClipboardChanged;

        protected override void Dispose(bool disposing)
        {
            ChangeClipboardChain(this.Handle, nextClipboardViewer);
            base.Dispose(disposing);
        }

        [DllImport("User32.dll")]
        private static extern int SetClipboardViewer(int hWndNewViewer);

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        private static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

        protected override void WndProc(ref Message m)
        {
            const int WM_DRAWCLIPBOARD = 0x308;
            const int WM_CHANGECBCHAIN = 0x030D;

            switch (m.Msg)
            {
                case WM_DRAWCLIPBOARD:
                    OnClipboardChanged();
                    SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;
                case WM_CHANGECBCHAIN:
                    if (m.WParam == nextClipboardViewer)
                        nextClipboardViewer = m.LParam;
                    else
                        SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;
                default:
                    base.WndProc(ref m);
                    break;
            }
        }

        private void OnClipboardChanged()
        {
            try
            {
                IDataObject data = Clipboard.GetDataObject();
                ClipboardChanged?.Invoke(this, new ClipboardChangedEventArgs(data));
            }
            catch (Exception ex)
            {
                // Handle exceptions appropriately (e.g., log the error)
                MessageBox.Show(ex.ToString());
            }
        }
    }

    public class ClipboardChangedEventArgs : EventArgs
    {
        public readonly IDataObject DataObject;

        public ClipboardChangedEventArgs(IDataObject dataObject)
        {
            DataObject = dataObject;
        }
    }
}</code>

Ce code affiné fournit une solution plus robuste et de gestion des erreurs pour surveiller les modifications du presse-papiers dans vos applications C#. N'oubliez pas de gérer les exceptions potentielles de manière appropriée dans un environnement de production.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn