幼稚检测
您可能想到的第一个解决方案是检测WM_PASTE
覆盖的消息,WndProc
但不幸的是,控件在执行粘贴操作时不会将该消息发送给自身。
检测键盘事件(您必须覆盖该OnKeyDown
功能)并检查组合键(CTRL+V 和 SHIFT+INS)是否是粘贴文本的方式,您可以解决此问题。
Protected Sub OnKeyDown(ByVal e As KeyEventArgs)
Dim ctrlV As Boolean = e.Modifiers = Keys.Control && e.KeyCode = Keys.V
Dim shiftIns As Boolean = e.Modifiers = Keys.Shift && e.KeyCode = Keys.Insert
If ctrlV Or shiftIns Then
ProcessAllLines
End If
End Sub
它运行良好,但您无法捕捉使用鼠标进行的粘贴操作(右键单击以打开上下文菜单)和通过拖放进行的粘贴操作。如果您不需要它们,您可以使用此解决方案(至少它简单明了)。
更好的检测
假设:当用户在里面输入时,RichTextBox
他每次插入一个字符。你怎么能用这个?好吧,当您检测到更大的更改时,您检测到了粘贴操作,因为用户每次不能输入超过一次的字符(由于 Unicode 代理项,这并不总是正确的,但在这种情况下这不是问题)。
它不适用于每个 IME(例如,我没有尝试使用远东语言)和 Unicode 代理,但对于西方语言来说没关系(无论如何,即使它不起作用,您也只需重新处理所有行) . 另请阅读这篇文章和这篇文章,了解有关 Unicode 和C# 版本的这个(双)答案的更多详细信息。
Dim _previousLength As Int32 = 0
Protected Sub richTextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim currentLength As Int32 = richTextBox.Text.Length
If Math.Abs(currentLength - _previousLength) > 1 Then
ProcessAllLines
End If
_previousLength = currentLength
End Sub
完美解决方案
完美的解决方案当然存在(在 Windows 8 或更高版本上),原生富编辑控件发送EN_CLIPFORMAT
通知消息。它旨在通知 Rich Edit 控件的父窗口发生了特定剪贴板格式的粘贴。然后,您可以覆盖WndProc
其父级以检测WM_NOTIFY
此通知的消息。无论如何,这不是几行代码,有关详细信息,请查看 MSDN 上的此链接:http: //msdn.microsoft.com/en-us/library/windows/desktop/hh768385 (v=vs.85).aspx 。