首頁 > 後端開發 > C++ > 如何在C#中監控剪貼簿變化?

如何在C#中監控剪貼簿變化?

Susan Sarandon
發布: 2025-01-22 21:06:14
原創
197 人瀏覽過

How to Monitor Clipboard Changes in C#?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板