简体   繁体   中英

VB.Net detect keydown on control before keydown on form event

I have enabled the KeyPreview option on the form and on the keydown of the form I am detecting the Escape keydown to popup a msgbox requesting whether the user wants to exit from the application.

But the problem is, I have one textbox that needs to clear its contents on Escape keypress rather than asking whether the user needs to exit. And I tried using the keydown event on this control but the form keydown event occurs before the control keydown (I want this to happen the other way around).

Code on the Textbox

    Private Sub txtAmount(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtAmount.KeyDown
        If e.KeyCode = Keys.Escape Then
            '//Escape keypress
            MsgBox("TEXTBOX ESCAPE")
            sender.Text = ""
        End If
    End Sub

Code used on the Main menu Form

    Private Sub frmMainMenu_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = Keys.Escape Then Application.Exit()
    End Sub

I can't use the previewkeydown either because the MaskTextBox doesn't raise the previewkeydown event..

Check if txtAmount is focused in the Form_KeyDown:

    Private Sub txtAmount_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtAmount.KeyDown
        If e.KeyCode = Keys.Escape Then
            '//Escape keypress
            MsgBox("TEXTBOX ESCAPE")
            sender.Text = ""
        End If
    End Sub

    Private Sub frmMainMenu_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If txtAmount.Focused Then Return
        If e.KeyCode = Keys.Escape Then Application.Exit()
    End Sub

Edit: Alternatively, if you don't want to specify each control individually, you could do it by type:

    If TypeOf Me.ActiveControl Is MaskTextBox Then Return

Or even more simpler, change your Form_KeyDown-Event to a KeyUp Event.

Public Class frmMainMenu
    Private KeyHandled As Boolean

    Private Sub txtAmount_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtAmount.KeyDown
        If e.KeyCode = Keys.Escape Then
            sender.Text = ""
            KeyHandled = True
        End If
    End Sub

    Private Sub frmMainMenu_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        KeyHandled = False
    End Sub

    Private Sub frmMainMenu_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If KeyHandled Then Return
        If e.KeyCode = Keys.Escape Then Application.Exit()
    End Sub

End Class

Here is my code

Private Sub When_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown, MyBase.KeyDown
    If sender.name = "Your form name" Then
        If e.KeyCode = Keys.Escape And Not TextBox1.Focused Then
            MsgBox("me")
        End If
    ElseIf sender.name = "your textBox name" Then
        If e.KeyCode = Keys.Escape Then
            MsgBox("txt")
        End If
    End If
End Sub

I hope this can help you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM