Обнаружение вставки из буфера обмена в ToolStripTextBox (C#)

Мне нужно определить, вставляет ли пользователь текст из буфера обмена в ToolStripTextBox. Поэтому я создал собственный элемент управления, который наследуется от ToolStripTextBox. Затем я хотел переопределить WndProc, чтобы перехватить сообщение WM_PASTE, но заметил, что WndProc для переопределения отсутствует. Для стандартного TextBox описанный метод отлично работает.

Любое предложение, что делать, чтобы обнаружить вставку из буфера обмена в ToolStripTextBox?


person user1225775    schedule 07.08.2012    source источник
comment
Думали ли вы о создании пользовательского элемента управления, который наследует стандартный TextBox и реализует то, что вы хотите от ToolStripTextBox?   -  person seekerOfKnowledge    schedule 07.08.2012


Ответы (3)


WndProc в ToolStripTextBox кажется недосягаемым. Я немного поискал из любопытства и наткнулся на этот ответ - https://stackoverflow.com/a/4688745/168719

Если использование ToolStripControlHost не вариант, есть еще другие умные решения для сценариев, требующих пользовательской обработки WndProc:

http://bytes.com/topic/c-sharp/answers/279168-toolstriptextbox-right-click

Николас Палдино [.NET/C# MVP]

Я только что это заметил. Чтобы обойти это, вы можете получить размещенный TextBox, вызвав свойство TextBox. Затем вы сможете создать класс, производный от NativeWindow, который переопределяет метод WndProc, чтобы игнорировать сообщение контекстного меню [или, очевидно, перехватывать WM_PASTE...] Когда вы получаете свойство текстового поля, получаете дескриптор и назначаете дескриптор в ваш переопределенный класс NativeWindow.

person Konrad Morawski    schedule 07.08.2012
comment
Большое спасибо, это решение! Работает идеально и это именно то, что я искал! - person user1225775; 07.08.2012
comment
Спасибо :) Вся заслуга, конечно, принадлежит первоначальным авторам. - person Konrad Morawski; 07.08.2012

Если вы находитесь в Windows[Windowsforms/WPF], вы можете использовать буфер обмена для обнаружения данных.

if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
            {

            richTextBox1.Paste();
            MessageBox.Show("You have data in clipboard")

            }

(Отредактировано для включения WPF)

person Rajesh    schedule 07.08.2012
comment
Источник: здесь я позаимствовал код из своего приложения: code.google.com/p/nepaliwikipediatranslator/source/browse/trunk/ - person Rajesh; 07.08.2012
comment
Просто для уточнения: само приложение не обязательно должно быть приложением WinForm, это может быть WPF или что-то еще (консоль и т. д.). Clipboard просто находится в пространстве имен WinForms. Но все же вы можете очень хорошо использовать его во всех типах приложений. Все, что требуется, это добавить ссылку на System.Windows.Forms. Точно так же вы можете использовать библиотеки Microsoft VB из приложений C#. - person Konrad Morawski; 07.08.2012
comment
Да, я использую Windows.Forms. Я знаю, КАК извлекать текст из буфера обмена, но на самом деле я хочу определить, КОГДА пользователь пытается вставить текст из буфера обмена. - person user1225775; 07.08.2012
comment
Хорошо, я понимаю.. Однако, когда пользователь пытается вставить, программа войдет в блок if .. if(...GetDataPresent()...) Это то, что вы хотели? - person Rajesh; 07.08.2012
comment
Он хочет знать, куда поместить ваш код. В каком случае этот код должен работать так, как ожидалось? TextChanged из ToolStripTextBox? - person seekerOfKnowledge; 07.08.2012

ToolStripTextBox - это хост-элемент управления, содержащий стандартное текстовое поле, вам нужно будет сделать, как вы описали, но заменить ToolStripTextBox.TextBox своим текстовым полем, к сожалению, это свойство доступно только для чтения.

Таким образом, вам нужно получить MyToolStripTextBox от ToolStripControlHost, чтобы иметь возможность изменить тип элемента управления, который он размещает.

person James Barrass    schedule 07.08.2012