检测粘贴操作有点棘手RichTextBox
.
第一个解决方案可能是检测WM_PASTE
消息覆盖WndProc
但不幸的是,当控件执行粘贴操作时,它不会将该消息发送给自身。
简单检测
To detect the keyboard events may work (you have to override the OnKeyDown
function) then check if the key combinations (CTRL+V and SHIFT+INS). Something like this:
protected override OnKeyDown(KeyEventArgs e)
{
bool ctrlV = e.Modifiers == Keys.Control && e.KeyCode == Keys.V;
bool shiftIns = e.Modifiers == Keys.Shift && e.KeyCode == Keys.Insert;
if (ctrlV || shiftIns)
DoSomething();
}
它工作得很好,但您无法捕获使用鼠标进行的粘贴操作(右键单击打开上下文菜单)和通过拖放进行的粘贴操作。如果您不需要它们,您可以使用此解决方案(至少它简单明了)。
更好的检测
假设:当用户在RichTextBox
他每次插入一个字符。你如何使用这个?好吧,当您检测到较大的更改时,您检测到了粘贴操作,因为用户每次不能键入多个字符(好吧,您可以说由于 Unicode 代理项的原因,这并不总是正确的)。也可以看看VB.NET版本 https://stackoverflow.com/a/10122729/1207195 and 有关 Unicode 的更多详细信息 https://stackoverflow.com/a/27229590/1207195 stuff.
private int _previousLength = 0;
private void richTextBox_TextChanged(object sender, EventArgs e)
{
int currentLength = richTextBox.Text.Length;
if (Math.Abs(currentLength - _previousLength) > 1)
ProcessAllLines();
_previousLength = currentLength;
}
请注意,您不能(因为输入法的工作方式不同)使用OnKeyDown
(或类似)。这仅适用于西方语言,但它对 Unicode 内容有问题(因为,例如,String.Length
财产可增加两倍Char
当用户输入单个字符时。也可以看看这个帖子 https://stackoverflow.com/a/23370462/1207195有关此的更多详细信息(好吧,这是强烈建议阅读的,即使 - 在这种情况下 - 你不关心它)。在那篇文章中,您还将找到用于确定字符串长度的更好算法的代码。简而言之,你必须更换:
int currentLength = richTextBox.Text.Length;
有了这个:
int currentLength = StringInfo.GetTextElementEnumerator(richTextBox.Text)
.Cast<string>()
.Count();
经过所有这些努力,您可能会意识到...用户甚至可以粘贴单个字符,并且可能不会被检测到。你是对的,这就是为什么这是一个更好的检测代替完美的解决方案.
完美解决方案
完美的解决方案(如果您在 Windows 8 上运行)当然存在,本机丰富的编辑控件发送一个EN_CLIPFORMAT
通知消息。它的目的是通知丰富的编辑控件的父窗口发生了特定剪贴板格式的粘贴。然后您可以覆盖WndProc
其父级来检测WM_NOTIFY
此通知的消息。无论如何,这不是几行代码,检查一下MSDN 文章 http://msdn.microsoft.com/en-us/library/windows/desktop/hh768385(v=vs.85).aspx了解详情。