Я должен "изменить" все вставляемые в текст TextBox, который покажут некоторым структурированным способом. Я могу сделать это с drag-n-drop, ctrl-v, но как сделать это с меню "Paste" контекста по умолчанию?
Хотя обычно я бы не предлагал перейти на низкоуровневый Windows API, и это может быть не единственный способ сделать это, он действительно помогает:
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<ClipboardEventArgs> 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
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[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);
}
}
В конечном итоге инструментарий WinForms не очень хороший. Это тонкая оболочка вокруг Win32 и общих элементов управления. Он предоставляет 80% наиболее полезных API. Остальные 20% часто отсутствуют или не раскрываются очевидным образом. Я бы посоветовал отойти от WinForms и по возможности перейти на WPF, поскольку WPF кажется лучшей архитектурой для графических интерфейсов .NET.