Kaedah pemantauan perubahan papan keratan C#
C# sendiri tidak memberitahu secara langsung acara khusus pengubahsuaian papan keratan. Walau bagaimanapun, kita boleh menyelesaikan masalah ini dengan melaksanakan fungsi "pemantauan papan klip" melalui kawalan tambahan.
Kaedah ini memerlukan mencipta kawalan tersuai yang mewarisi daripada kelas Control
dan mengandungi acara ClipboardChanged
. Pembina kawalan harus menyediakan tetingkap pemapar papan keratan dan melampirkannya pada rantai papan keratan.
Apabila kandungan papan keratan berubah, kaedah WndProc
kawalan akan memintas mesej WM_DRAWCLIPBOARD
dan mencetuskan acara ClipboardChanged
. Pengendali acara ini boleh digunakan untuk mendapatkan semula kandungan papan keratan yang diubah suai.
Berikut ialah contoh pelaksanaan kawalan pemantauan papan keratan:
<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>
Dengan menggunakan kawalan ini, anda boleh memantau perubahan papan keratan dalam aplikasi C# anda.
Atas ialah kandungan terperinci Bagaimana untuk Memantau Perubahan Papan Klip dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!