Maison >développement back-end >C++ >Comment puis-je détecter les modifications du Presse-papiers en 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 :
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.
WndProc
Override : La méthode WndProc
intercepte les messages Windows. Nous ciblons spécifiquement WM_DRAWCLIPBOARD
.
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.
Récupération de données : OnClipboardChanged
utilise Clipboard.GetDataObject()
pour récupérer les données mises à jour du presse-papiers.
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!