【问题标题】:VB.Net detect keydown on control before keydown on form eventVB.Net在表单事件上的keydown之前检测控件上的keydown
【发布时间】:2014-07-01 08:22:01
【问题描述】:

我已经在表单和表单的 keydown 上启用了 KeyPreview 选项,我正在检测 Escape keydown 以弹出一个 msgbox 请求用户是否要退出应用程序。

但问题是,我有一个文本框需要在 Escape 按键上清除其内容,而不是询问用户是否需要退出。我尝试在此控件上使用 keydown 事件,但表单 keydown 事件发生在控件 keydown 之前(我希望反过来发生)。

文本框上的代码

    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

主菜单表单上使用的代码

    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

我也不能使用 previewkeydown ,因为 MaskTextBox 不会引发 previewkeydown 事件..

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    检查 txtAmount 是否集中在 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
    

    编辑:或者,如果您不想单独指定每个控件,您可以按类型进行:

        If TypeOf Me.ActiveControl Is MaskTextBox Then Return
    

    或者更简单,将 Form_KeyDown-Event 更改为 KeyUp 事件。

    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
    

    【讨论】:

    • 对于这个问题没有更好的解决方法..因为我必须在我的 frmMainMenu keydown 上添加所有要跳过的控件..
    • .Focused = True 的解决方案让我明确设置不应执行热键的位置。感谢这个想法@dummy
    【解决方案2】:

    这是我的代码

    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
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2023-03-10
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多