Clipboard event C#

前端 未结 8 939
说谎
说谎 2020-11-22 09:11

Is there a clipboard changed or updated event that i can access through C#?

8条回答
  •  一整个雨季
    2020-11-22 09:55

    For completeness, here's the control I'm using in production code. Just drag from the designer and double click to create the event handler.

    using System;
    using System.ComponentModel;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace ClipboardAssist {
    
    // Must inherit Control, not Component, in order to have 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);
        }
    
        /// 
        /// Clipboard contents changed.
        /// 
        public event EventHandler 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)
        {
            // defined in 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)
            {
                // Swallow or pop-up, not sure
                // Trace.Write(e.ToString());
                MessageBox.Show(e.ToString());
            }
        }
    }
    
    public class ClipboardChangedEventArgs : EventArgs
    {
        public readonly IDataObject DataObject;
    
        public ClipboardChangedEventArgs(IDataObject dataObject)
        {
            DataObject = dataObject;
        }
    }
    }
    

提交回复
热议问题