Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengesan Perubahan Papan Klip dalam C#?

Bagaimanakah Saya Boleh Mengesan Perubahan Papan Klip dalam C#?

Patricia Arquette
Lepaskan: 2025-01-22 21:16:15
asal
947 orang telah melayarinya

How Can I Detect Clipboard Changes in C#?

Pemantauan Papan Klip masa nyata dengan C#

Artikel ini menunjukkan cara mencipta aplikasi C# yang memantau perubahan papan keratan dengan cekap. Cabarannya terletak pada pengesanan apabila kandungan papan keratan dikemas kini.

Penyelesaian:

Menggunakan pengendalian mesej Windows menyediakan penyelesaian yang mantap. Ini melibatkan:

  1. Kawalan Tersuai: Kawalan tersuai, yang diwarisi daripada Control (bukan Component), adalah penting untuk mendapatkan pemegang tingkap. Pemegang ini diperlukan untuk berinteraksi dengan baris gilir mesej Windows.

  2. WndProc Override: Kaedah WndProc memintas mesej Windows. Kami menyasarkan secara khusus WM_DRAWCLIPBOARD.

  3. WM_DRAWCLIPBOARD Pengendalian: Mesej ini menandakan kemas kini papan keratan. Dalam kaedah WndProc, apabila WM_DRAWCLIPBOARD diterima, kaedah OnClipboardChanged digunakan.

  4. Pendapatan Data: OnClipboardChanged menggunakan Clipboard.GetDataObject() untuk mendapatkan semula data papan keratan yang dikemas kini.

  5. Pencetus Peristiwa: Akhirnya, acara ClipboardChanged tersuai dibangkitkan, menghantar data baharu.

Berikut ialah contoh kod yang mempamerkan kawalan pemantauan papan keratan:

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

Kod yang diperhalusi ini menyediakan penyelesaian yang lebih mantap dan dikendalikan ralat untuk memantau perubahan papan keratan dalam aplikasi C# anda. Ingat untuk mengendalikan kemungkinan pengecualian dengan sewajarnya dalam persekitaran pengeluaran.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Perubahan Papan Klip dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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