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
Libérer: 2025-01-22 21:16:15
original
946 Les gens l'ont consulté

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 :

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;
        }
    }
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal