我需要对所有粘贴到TextBox文本中的内容进行“修改”,以便以某种结构化方式进行显示。我可以通过ctrl-v拖放来实现,但是如何使用默认上下文菜单“粘贴”来实现?
最佳答案
虽然我通常不建议使用低级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和Common Controls的薄薄包装。它公开了最有用的API的80%。另外20%通常以明显的方式丢失或未暴露。我建议如果可能的话,从WinForms转移到WPF,因为WPF似乎是.NET GUI的更好的架构框架。
关于c# - 钩住WinForms TextBox控件的默认 "Paste"事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3446233/