【问题标题】:How to prevent the enter key from triggering a click event when a button is in focus当按钮处于焦点时如何防止回车键触发点击事件
【发布时间】:2014-01-05 18:18:46
【问题描述】:

我正在尝试制作一个程序,它可以接受基于按钮的输入以及基于键盘的输入,然后将其输出到文本框。但是我想使用 Enter 键来触发函数输出到文本框。但是,由于表单上有按钮。当按下回车键时,它们将像鼠标单击事件一样被触发。我需要找到一种方法来使回车键仅触发我想要的事件而不触发按钮。或者我需要找到一种方法让按钮永远不会有焦点,并且焦点总是在表单本身上,同时仍然可以点击按钮。有什么帮助吗?

       If e.KeyCode = Keys.Enter Then
        SecondNum = Val(TB_Output.Text)
        ResultEquals()
        TB_Output.Text = Result
    End If

【问题讨论】:

  • 查看System.Windows.Form 类的KeyPreview 属性。
  • 空格键操作带有焦点的按钮。 Enter 键的作用完全不同,它操作您选择作为默认接受键的按钮。通常是 OK 按钮。如果您已经对自己的 UI 感到困惑,那么您的用户也没有多少机会,也许改变它不是一个好主意......
  • @HansPassant:我对此进行了测试,似乎输入和空格在焦点按钮上的操作相同,即按下按钮。尝试了不同的方法,没有区别。那么您指的是哪种设置,它将按照您上面描述的方式工作?

标签: vb.net visual-studio-2012 enter keycode


【解决方案1】:

理论上,将表单的KeyPreview 属性设置为True 应该可以做到。然后处理 KeyDown 事件,并确保在按下 Enter 键时将 e.Handled 设置为 True(或 e.SuppressKeyPress,取决于您正在使用的控件的实现)。

我刚才在一个示例项目中尝试了这种方法,但是由于某种原因它无法使用按钮。您可能需要在表单级别使用 WndProc,这总是 100% 有效。

【讨论】:

    【解决方案2】:

    如果你想直接进入关键事件的核心,甚至拦截箭头和其他改变焦点的键,你需要这样的东西:

    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
            Select Case keyData
                Case Keys.Enter
                    'your logic here
                    Return True  'this surpresses any default action
            End Select
            Return MyBase.ProcessDialogKey(keyData) 'this allows the default action to be processed for any cases you haven't explicitly intercepted
    
        End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2015-04-28
      相关资源
      最近更新 更多