Zwischenablage verändern



  • Hi,
    ich habe hier einen Programmcode zum Überwachen der Zwischenablage, d.h. sobald sich die Zwischenablage verändert wird das Programm darüber informiert.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace Translator
    {
        public partial class Form1 : Form
        {
            [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);
    
            IntPtr nextClipboardViewer;
    
            public Form1()
            {
                InitializeComponent();
                //Clipboard.SetText("Welcome to Translator 1.00");
    
                nextClipboardViewer = (IntPtr)SetClipboardViewer((int)
                             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:
                        checkStatus();
                        if (on)
                            DisplayClipboardData();
    
                        SendMessage(nextClipboardViewer, m.Msg, m.WParam,
                                    m.LParam);
    
                        this.Close();
                        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 DisplayClipboardData()
            {
                string text = "";
                if (Clipboard.ContainsText())
                    text = Clipboard.GetText().ToLower().Trim();
    
                richTextBox1.Text = text;
    
                //Clipboard.SetText(translation());
            }
    
            void checkStatus()
            {
                IDataObject iData = new DataObject();
                iData = Clipboard.GetDataObject();
    
                if (((string)iData.GetData(DataFormats.Text)).Equals("+on"))
                    on = true;
                if (((string)iData.GetData(DataFormats.Text)).Equals("+off"))
                    on = false;
            }
    
            bool on = true;
    
            private void Form1_Load_1(object sender, EventArgs e) { }
        }
    }
    

    mein Problem ist, dass ich gerne den in der Zwischenablage abgelegten Text verändern möchte, was mir aber bis jetzt nicht möglich war, da der Code sich immer und immer wieder ausführt => sobald ich das ganze veränder wird es wieder und wieder verändert 🙂

    würde mich sehr über Ratschläge freuen
    greetings,
    warum geht nicht?



  • Hallo.

    Bitte beschreibe das nächste mal das erwartete und beobachtete Verhalten genauer.

    Folgendes könnte helfen, falls ich Dein Problem verstanden habe:

    //Feldvariable
    bool noReact = true;
    
    //in WndProc
    if(noReact)
    	DisplayClipboardData();
    
    //in DisplayClipboardData
    noReact = false;
    Clipboard.SetText(text+text); //text+text nur zum test....
    noReact = true;
    


  • manchmal kann es so einfach sein...
    big merci! 🙂


Anmelden zum Antworten