首頁 >後端開發 >C++ >如何在 C# 中偵測剪貼簿變更?

如何在 C# 中偵測剪貼簿變更?

Patricia Arquette
Patricia Arquette原創
2025-01-22 21:16:15911瀏覽

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