首页 >后端开发 >C++ >如何在 C# 中检测剪贴板更改?

如何在 C# 中检测剪贴板更改?

Patricia Arquette
Patricia Arquette原创
2025-01-22 21:16:15879浏览

How Can I Detect Clipboard Changes in C#?

使用 C# 进行实时剪贴板监控

本文演示了如何创建一个有效监视剪贴板更改的 C# 应用程序。 挑战在于检测剪贴板内容何时更新。

解决方案:

利用 Windows 消息处理提供了一个强大的解决方案。这涉及:

  1. 自定义控件:继承自Control(而不是Component)的自定义控件对于获取窗口句柄至关重要。 该句柄对于与 Windows 消息队列交互是必需的。

  2. WndProc 覆盖: WndProc 方法拦截 Windows 消息。我们专门针对WM_DRAWCLIPBOARD

  3. WM_DRAWCLIPBOARD 处理: 此消息表示剪贴板更新。 在 WndProc 方法中,当接收到 WM_DRAWCLIPBOARD 时,将调用 OnClipboardChanged 方法。

  4. 数据检索: OnClipboardChanged 使用 Clipboard.GetDataObject() 检索更新的剪贴板数据。

  5. 事件触发器:最后,引发自定义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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn