If you have ever wanted to get the deleted character/text from a textbox when the Backspace key or the Delete key on the keyboard is pressed, you would know that there is no easy way to do that. You can easily get the typed text (using any of the keyboard events like KeyDown, KeyPress etc.), but not the deleted text.
However it is not impossible to achieve this. All you need is some event/method that executes before the KeyDown event is fired. And fortunately there are many.
For this demo I will show you how to do that using the ProcessKeyMessage , but you can use any of the others as well (e.g. WndProc etc.)
Public Class TextBoxEx
Inherits TextBox
Private Const WM_KEYDOWN = &H100
'' This property stores our deleted text
'' If you are using pre vb2010, you wll have to put the full property declaration here with Get and Set
Public Property DeletedText As String
Protected Overrides Function ProcessKeyMessage(ByRef m As System.Windows.Forms.Message) As Boolean
If m.Msg = WM_KEYDOWN Then
Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode
Select Case keyCode
Case Keys.Back
If Me.SelectionLength = 0 Then
If Me.SelectionStart > 0 Then DeletedText = Me.Text.Substring(Me.SelectionStart - 1, 1)
Else
DeletedText = Me.SelectedText
End If
Case Keys.Delete
If Me.SelectionLength = 0 Then
If Me.SelectionStart < Me.TextLength Then DeletedText = Me.Text.Substring(Me.SelectionStart, 1)
Else
DeletedText = Me.SelectedText
End If
End Select
End If
Return MyBase.ProcessKeyMessage(m)
End Function
Protected Overrides Sub OnKeyPress(e As System.Windows.Forms.KeyPressEventArgs)
If e.KeyChar vbBack Then DeletedText = ""
MyBase.OnKeyPress(e)
End Sub
End Class
That’s all we need to do.
To test the above code, just add the class to a new Windows forms application and recompile the application.
You should get a new item named TextBoxEx in the toolbox. Drag it on to your form and set its Multiline property to True. Then add the following code:
Private Sub TextBoxEx1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBoxEx1.TextChanged
Debug.Print("Deleted Text is: " & TextBoxEx1.DeletedText)
End Sub
Run the application and see what is printed in the Debug window. Notice that when you delete something in the textbox, it is saved in the DeletedText property and reflected in the Debug window.
For this demo, I’m storing the immediate deleted text only. But you can modify the class easily to make it behave whatever way you like.
Enjoy!![]()

Leave a Reply