Переопределить пасту в TextBox

Я хочу переопределить функцию вставки в конкретном текстовом поле. Когда текст вставляется в это текстовое поле, я хочу, чтобы он выполнял следующее:

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

(переход от многострочного к одиночному)

Как я могу это сделать?

Ответ 1

Это возможно, вы можете перехватить низкоуровневое сообщение Windows, которое получает встроенный элемент управления TextBox, который сообщает ему вставить из буфера обмена. Сообщение WM_PASTE. Создается как при нажатии Ctrl + V с помощью клавиатуры, так и в контекстном меню "Вставить". Вы поймаете его, переопределив метод управления WndProc(), выполнив пасту по желанию и не передайте ее базовому классу.

Добавьте новый класс в свой проект и скопируйте/вставьте код, показанный ниже. Компиляция. Отбросьте новый элемент управления сверху панели инструментов на свою форму, заменив существующий.

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

Чтобы перехватить сообщения в элементе управления текстовыми полями, выведите класс из TexBox и реализовать

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);
    }

}

предложил здесь