使用 C# 進行即時剪貼簿監控
本文示範如何建立一個有效監視剪貼簿變更的 C# 應用程式。 挑戰在於偵測剪貼簿內容何時更新。
解:
利用 Windows 訊息處理提供了一個強大的解決方案。這涉及:
自訂控制項:繼承自Control
(而不是Component
)的自訂控制項對於取得視窗句柄至關重要。 該句柄對於與 Windows 訊息佇列互動是必需的。
WndProc
覆蓋: WndProc
方法攔截 Windows 訊息。我們專門針對WM_DRAWCLIPBOARD
。
WM_DRAWCLIPBOARD
處理: 此訊息表示剪貼簿更新。 在 WndProc
方法中,當接收到 WM_DRAWCLIPBOARD
時,將呼叫 OnClipboardChanged
方法。
資料擷取: OnClipboardChanged
使用 Clipboard.GetDataObject()
擷取更新的剪貼簿資料。
事件觸發器:最後,引發自訂ClipboardChanged
事件,傳遞新資料。
這是一個展示剪貼簿監控控制項的程式碼範例:
<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>
這個精煉的程式碼提供了一個更強大和錯誤處理的解決方案,用於監視 C# 應用程式中的剪貼簿變更。 請記住在生產環境中適當處理潛在的異常。
以上是如何在 C# 中偵測剪貼簿變更?的詳細內容。更多資訊請關注PHP中文網其他相關文章!