Maison >développement back-end >C++ >Comment surveiller les modifications du Presse-papiers en C# ?
Méthode de surveillance des modifications du presse-papiers C#
C# lui-même ne notifie pas directement l'événement dédié de modification du presse-papiers. Cependant, nous pouvons résoudre ce problème en implémentant la fonction « surveillance du presse-papiers » via des commandes auxiliaires.
Cette méthode nécessite la création d'un contrôle personnalisé qui hérite de la classe Control
et contient l'événement ClipboardChanged
. Le constructeur du contrôle doit configurer la fenêtre de visualisation du presse-papiers et l'attacher à la chaîne du presse-papiers.
Lorsque le contenu du presse-papiers change, la méthode WndProc
du contrôle interceptera le message WM_DRAWCLIPBOARD
et déclenchera l'événement ClipboardChanged
. Ce gestionnaire d'événements peut être utilisé pour récupérer le contenu modifié du presse-papiers.
Ce qui suit est un exemple d'implémentation d'un 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 ClipboardAssist { // 必须继承Control,而不是Component,才能拥有Handle [DefaultEvent("ClipboardChanged")] public partial class ClipboardMonitor : Control { IntPtr nextClipboardViewer; public ClipboardMonitor() { this.BackColor = Color.Red; this.Visible = false; nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle); } /// <summary> /// 剪贴板内容已更改。 /// </summary> public event EventHandler<ClipboardChangedEventArgs> ClipboardChanged; protected override void Dispose(bool disposing) { ChangeClipboardChain(this.Handle, nextClipboardViewer); } [DllImport("User32.dll")] protected static extern int SetClipboardViewer(int hWndNewViewer); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); protected override void WndProc(ref System.Windows.Forms.Message m) { // 定义于winuser.h 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; } } void OnClipboardChanged() { try { IDataObject iData = Clipboard.GetDataObject(); if (ClipboardChanged != null) { ClipboardChanged(this, new ClipboardChangedEventArgs(iData)); } } catch (Exception e) { // 忽略或弹出,不确定 // Trace.Write(e.ToString()); MessageBox.Show(e.ToString()); } } } public class ClipboardChangedEventArgs : EventArgs { public readonly IDataObject DataObject; public ClipboardChangedEventArgs(IDataObject dataObject) { DataObject = dataObject; } } }</code>
En utilisant ce contrôle, vous pouvez surveiller les modifications du presse-papiers dans votre application C#.
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!