C#剪貼簿更改監控方法
C#本身並沒有直接通知剪貼簿修改的專用事件。然而,我們可以透過輔助控制實現「剪貼簿監控」功能來解決這個問題。
此方法需要建立自訂控件,繼承自Control
類別並包含ClipboardChanged
事件。此控制項的建構子應設定剪貼簿檢視器窗口,並將其附加到剪貼簿鏈。
當剪貼簿內容改變時,控制項的WndProc
方法會攔截WM_DRAWCLIPBOARD
訊息,並觸發ClipboardChanged
事件。此事件處理程序可用於檢索修改後的剪貼簿內容。
以下是一個剪貼簿監控控制的範例實作:
<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>
透過使用此控件,您可以監控C#應用程式中的剪貼簿變更。
以上是如何在C#中監控剪貼簿變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!