Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memantau Perubahan Papan Klip dalam C#?

Bagaimana untuk Memantau Perubahan Papan Klip dalam C#?

Susan Sarandon
Lepaskan: 2025-01-22 21:06:14
asal
222 orang telah melayarinya

How to Monitor Clipboard Changes in C#?

Kaedah pemantauan perubahan papan keratan C#

C# sendiri tidak memberitahu secara langsung acara khusus pengubahsuaian papan keratan. Walau bagaimanapun, kita boleh menyelesaikan masalah ini dengan melaksanakan fungsi "pemantauan papan klip" melalui kawalan tambahan.

Kaedah ini memerlukan mencipta kawalan tersuai yang mewarisi daripada kelas Control dan mengandungi acara ClipboardChanged. Pembina kawalan harus menyediakan tetingkap pemapar papan keratan dan melampirkannya pada rantai papan keratan.

Apabila kandungan papan keratan berubah, kaedah WndProc kawalan akan memintas mesej WM_DRAWCLIPBOARD dan mencetuskan acara ClipboardChanged. Pengendali acara ini boleh digunakan untuk mendapatkan semula kandungan papan keratan yang diubah suai.

Berikut ialah contoh pelaksanaan kawalan pemantauan papan keratan:

<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>
Salin selepas log masuk

Dengan menggunakan kawalan ini, anda boleh memantau perubahan papan keratan dalam aplikasi C# anda.

Atas ialah kandungan terperinci Bagaimana untuk Memantau Perubahan Papan Klip dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan