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
875 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:

<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>
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!

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