Laden...

Clipboard Spy

Erstellt von Vertexwahn vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.562 Views
V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren
Clipboard Spy

ich möchte einen Clipboard Spy programmieren, d. h. ein Programm, das alles auflistet, was in der Zwischenablage landet. Gibt es eine einfache Möglichkeit z. B. über Delegates, die mein Programm immer dann informieren, wenn etwas neues in der Zwischenablage landet?

in reinen WinAPI war das kein Problem - einfach als Clipboard Viewer registrieren und fertig konnte leider bisher nichts ähnliches in .Net finden

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Vertexwahn,

wenn es solche Events gäbe, wüsste ich keinen Grund, warum sie nicht in der Clipboard-Klasse sein sollten.

Es gibt wohl zwei Möglichkeiten: Du benutzt Win32 (DllImport) oder einen Timer.

herbivore

V
Vertexwahn Themenstarter:in
179 Beiträge seit 2005
vor 18 Jahren

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace ClipboardSpy
{
    public class ClipboardSpyWindow : System.Windows.Forms.Form
    {
        private System.ComponentModel.Container components = null;

        public ClipboardSpyWindow()
        {
            InitializeComponent();

            m_NextClipboardViewer = WinAPI.SetClipboardViewer(this.Handle);
        }

        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:
                    DisplayClipboardData();
                    WinAPI.SendMessage(m_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;

                case WM_CHANGECBCHAIN:
                    if (m.WParam == m_NextClipboardViewer)
                        m_NextClipboardViewer = m.LParam;
                    else
                        WinAPI.SendMessage(m_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
                    break;

                default:
                    base.WndProc(ref m);
                    break;
            }
        }


        public void DisplayClipboardData()
        {
            listBoxClipboardContent.Items.Clear();
            
            IDataObject d = Clipboard.GetDataObject();
            
            if(d.GetDataPresent(DataFormats.Bitmap))
                listBoxClipboardContent.Items.Add("Bitmap!");
            
            if(d.GetDataPresent(DataFormats.CommaSeparatedValue))
                listBoxClipboardContent.Items.Add("CommaSeparatedValue");

            if(d.GetDataPresent(DataFormats.Dib))
                listBoxClipboardContent.Items.Add("Dib");

            if(d.GetDataPresent(DataFormats.Dif))
                listBoxClipboardContent.Items.Add("Dif");

            if(d.GetDataPresent(DataFormats.EnhancedMetafile))
                listBoxClipboardContent.Items.Add("EnhancedMetafile");

            if(d.GetDataPresent(DataFormats.Html))
                listBoxClipboardContent.Items.Add("Html");

            if(d.GetDataPresent(DataFormats.Riff))
                listBoxClipboardContent.Items.Add("Riff");

            if(d.GetDataPresent(DataFormats.Rtf))
                listBoxClipboardContent.Items.Add("Rtf");

            if(d.GetDataPresent(DataFormats.Text))
            {
                string tmp = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();
                listBoxClipboardContent.Items.Add("Text: " + tmp);
            }

            if(d.GetDataPresent(DataFormats.Tiff))
                listBoxClipboardContent.Items.Add("Tiff");

            if(d.GetDataPresent(DataFormats.UnicodeText))
                listBoxClipboardContent.Items.Add("UnicodeText");

            if(d.GetDataPresent(DataFormats.WaveAudio))
                listBoxClipboardContent.Items.Add("WaveAudio");
        }

        // Die verwendeten Ressourcen bereinigen.    
        protected override void Dispose( bool disposing )
        {
            WinAPI.ChangeClipboardChain(this.Handle, m_NextClipboardViewer);

            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Vom Windows Form-Designer generierter Code
        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung. 
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
            this.listBoxClipboardContent = new System.Windows.Forms.ListBox();
            this.SuspendLayout();
            // 
            // listBoxClipboardContent
            // 
            this.listBoxClipboardContent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right)));
            this.listBoxClipboardContent.Location = new System.Drawing.Point(0, 0);
            this.listBoxClipboardContent.Name = "listBoxClipboardContent";
            this.listBoxClipboardContent.Size = new System.Drawing.Size(296, 277);
            this.listBoxClipboardContent.TabIndex = 0;
            // 
            // ClipboardSpyWindow
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.listBoxClipboardContent);
            this.Name = "ClipboardSpyWindow";
            this.Text = "ClipboardSpy";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new ClipboardSpyWindow());
        }

        private System.Windows.Forms.ListBox listBoxClipboardContent;


        IntPtr        m_NextClipboardViewer;
    }

    public class WinAPI
    {
        [DllImport("User32.dll")]
        public static extern IntPtr
            SetClipboardViewer(IntPtr 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);
    }
}