Override Paste Into TextBox

2019-01-12 00:27发布

问题:

I want to override the paste function when in a specific textbox. When text is pasted into that textbox, I want it to execute the following:

AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");

(Changing from multiline to single)

How can I do this?

回答1:

That's possible, you can intercept the low-level Windows message that the native TextBox control gets that tells it to paste from the clipboard. The WM_PASTE message. Generated both when you press Ctrl+V with the keyboard or use the context menu's Paste command. You catch it by overriding the control's WndProc() method, performing the paste as desired and not pass it on to the base class.

Add a new class to your project and copy/paste the code shown below. Compile. Drop the new control from the top of the toolbox onto your form, replacing the existing one.

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void WndProc(ref Message m) {
        // Trap WM_PASTE:
        if (m.Msg == 0x302 && Clipboard.ContainsText()) {
            this.SelectedText = Clipboard.GetText().Replace('\n', ' ');
            return;
        }
        base.WndProc(ref m);
    }
}


回答2:

To intercept messages in textbox control, derive a class from TexBox and implement

class MyTB : System.Windows.Forms.TextBox
{

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {

            case 0x302: //WM_PASTE
                {
                    AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");
                    break;
                }

        }

        base.WndProc(ref m);
    }

}

suggested here