vb.net - Capture CTRL+V o pegue en un cuadro de texto en.NET
formatting hook (1)
VB.NET 2010: tengo un RichTextbox en el que el usuario puede ingresar datos manualmente o copiar / pegar desde otra fuente. Una vez que los datos estén completos, acierta y se resaltan algunas palabras clave. Mi problema es que si copia / pega de otra fuente también se copia el formato. Bueno, a veces la fuente externa tiene una fuente blanca y mi cuadro de texto tiene un fondo blanco, así que parece que no pegó nada y lo hace una y otra vez.
Lo que estoy buscando es una forma de interceptar la acción de pegar en el cuadro de texto para poder tomar ese texto y pegarlo como ASCII puro sin formatear.
Editar después de experimentar con KeyDown
Private Sub txtRch_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtRch.KeyDown
If e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.V Then
With txtRch
Dim i As Integer = .SelectionStart ''cache the current position
.Select(0, i) ''select text from start to current position
Dim s As String = .SelectedText ''copy that text to a variable
.Select(i, .TextLength) ''now select text from current position to end
Dim t As String = .SelectedText ''copy that text to a variable
Dim u As String = s & Clipboard.GetText(TextDataFormat.UnicodeText) & t ''now concatenate the first chunk, the new text, and the last chunk
.Clear() ''clear the textbox
.Text = u ''paste the new text back into textbox
.SelectionStart = i ''put cursor back to cached position
End With
''the event has been handled manually
e.Handled = True
End If
End Sub
Esto parece funcionar y todo mi texto queda retenido y todo es ASCII. Creo que si quisiera dar un paso más, también podría tomar la fuente y el color de mi RichTextbox, seleccionar todo el texto y luego asignar la fuente y el color a la selección.
En la mayoría de los casos, examinar el evento KeyDown debería ser lo suficientemente bueno junto con el uso de un RichTextBox temporal para modificar el texto entrante:
Private Sub RichTextBox1_KeyDown(sender As Object, e As KeyEventArgs) _
Handles RichTextBox1.KeyDown
If e.Modifiers = Keys.Control AndAlso e.KeyCode = Keys.V Then
Using box As New RichTextBox
box.SelectAll()
box.SelectedRtf = Clipboard.GetText(TextDataFormat.Rtf)
box.SelectAll()
box.SelectionBackColor = Color.White
box.SelectionColor = Color.Black
RichTextBox1.SelectedRtf = box.SelectedRtf
End Using
e.Handled = True
End If
End Sub
Nota: Falta la comprobación de errores.