使用 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中文网其他相关文章!