enganchar el evento “Pegar” predeterminado del control WinForms TextBox

Necesito “modificar” todo pegado en el texto de TextBox para que se muestre de alguna manera estructurada. Puedo hacerlo con drag-n-drop, ctrl-v, pero ¿cómo hacerlo con el menú de contexto predeterminado “Pegar”?

Si bien normalmente no sugeriría dejar caer a la API de bajo nivel de Windows, y esta puede no ser la única forma de hacerlo, lo hace el truco:

using System; using System.Windows.Forms; public class ClipboardEventArgs : EventArgs { public string ClipboardText { get; set; } public ClipboardEventArgs(string clipboardText) { ClipboardText = clipboardText; } } class MyTextBox : TextBox { public event EventHandler Pasted; private const int WM_PASTE = 0x0302; protected override void WndProc(ref Message m) { if (m.Msg == WM_PASTE) { var evt = Pasted; if (evt != null) { evt(this, new ClipboardEventArgs(Clipboard.GetText())); // don't let the base control handle the event again return; } } base.WndProc(ref m); } } static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var tb = new MyTextBox(); tb.Pasted += (sender, args) => MessageBox.Show("Pasted: " + args.ClipboardText); var form = new Form(); form.Controls.Add(tb); Application.Run(form); } } 

En definitiva, el kit de herramientas de WinForms no es muy bueno. Es una envoltura delgada sobre Win32 y los controles comunes. Expone el 80% de la API que es más útil. El otro 20% a menudo falta o no está expuesto de una manera que es obvia. Sugeriría alejarse de WinForms y de WPF si es posible, ya que WPF parece ser un mejor marco de architecture para .NET GUI.