【问题标题】:How do you set the focus onto a control with Alt-D?如何使用 Alt-D 将焦点设置到控件上?
【发布时间】:2014-01-21 17:59:09
【问题描述】:

我想在用户按下 Alt+D 时将焦点设置到控件上。但是,Alt+D 在 keydown 事件处理程序中设置焦点后将焦点设置在菜单条中的第一项上。

按下 Alt 键时将表单 KeyPreview 设置为 True 并将 e.Handled 设置为 true 无效。

对于这个例子,D 是一个任意键——它发生在所有字母键上。

我正在使用 vb.net 2008。

示例代码:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

If e.Alt And e.KeyCode = Keys.D Then
  Button1.Focus()
  e.Handled = True
End If

End Sub

示例表单,按下 Alt+D 后。在按下 Alt+D 之前,焦点位于 Button2。

【问题讨论】:

    标签: .net vb.net winforms


    【解决方案1】:

    您应该覆盖ProcessDialogKey 方法。

    这段代码可以:

    Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    
    If keyData = (Keys.Alt Or Keys.D) Then
      Call Form1_KeyDown(Nothing, New KeyEventArgs(Keys.Alt Or Keys.D))
      Return True
    Else
      Return MyBase.ProcessDialogKey(keyData)
      End If
    
    End Function
    

    【讨论】:

      【解决方案2】:
      Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
          If keyData = Keys.Alt And keyData = Keys.D Then
              Button1.Focus()
          End If
          Return True 'im not sure about this, I forgot the code
          Return MyBase.ProcessCmdKey(msg, keyData)
      End Function
      

      【讨论】:

      • 这可行,但这里有几个错误。 ProcessDialogKey 也可以,而且可能会更好。
      • 如果我想在我的应用程序中使用一些热键,这就是我使用的代码。到现在都没有问题。虽然我没有同时尝试过两个键:P
      • "Button1.Focus()" 永远不会执行。 "Return MyBase.ProcessCmdKey(msg, keyData)" 永远不会执行。它仍然非常有帮助,因此赞成 - 谢谢!
      • 在我的情况下使用 OR 而不是 AND 来评估 keyData 组合。帕特里克的解决方案更好
      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 2016-10-22
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多