简单检测
您可能想到的第一个解决方案是检测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
有用well但您无法捕获使用鼠标进行的粘贴操作(右键单击打开上下文菜单)和通过拖放进行的粘贴操作。如果您不需要它们,您可以使用此解决方案(至少它简单明了)。
更好的检测
假设:当用户在RichTextBox
他每次插入一个字符。你如何使用这个?好吧,当您检测到较大的更改时,您检测到了粘贴操作,因为用户每次不能键入多个字符(由于 Unicode 代理,这并不总是正确的,但在本例中这不是问题)。
它不适用于每种 IME(例如,我没有尝试使用远东语言)和 Unicode 代理,但对于西方语言来说还可以(无论如何,即使它不起作用,您也只需重新处理所有行) 。另请阅读这个帖子 and 这个帖子有关 Unicode 的更多详细信息和this(双胞胎)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
通知消息。它的目的是通知丰富的编辑控件的父窗口发生了特定剪贴板格式的粘贴。然后您可以覆盖WndProc
其父级来检测WM_NOTIFY
此通知的消息。无论如何,这不是几行代码,请查看 MSDN 上的此链接以了解详细信息:http://msdn.microsoft.com/en-us/library/windows/desktop/hh768385(v=vs.85).aspx.