表格的KeyEvent只能结合CTRL [英] KeyEvents on Form only works in combination with CTRL

查看:159
本文介绍了表格的KeyEvent只能结合CTRL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

code:

Private Sub KeyHandling(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
      Case Keys.Left
        btnPrev.PerformClick()
      Case Keys.Right
        btnNext.PerformClick()
      Case Keys.Up
        btnFirst.PerformClick()
      Case Keys.Down
        btnLast.PerformClick()
    End Select
End Sub

我的形式主要preVIEW属性已启用。

The KeyPreview property of my form is enabled.

问题:

这code什么都不会做,除非我按住Ctrl键。任何人都可以解释一下吗? :)

This code won't do anything, except when I hold the control key. Can anyone explain this? :)

推荐答案

这是因为光标键得到早期拦截,KeyDown事件触发之前。的WinForms用它来移动焦点,就像标签。当您按住Ctrl键,它不再是一个导航键,您的KeyDown事件可以看出来。

This is because the cursor keys get intercepted early, before the KeyDown event fires. Winforms uses it to move the focus, just like Tab. When you hold down the Ctrl key, it is no longer a navigating key and your KeyDown event can see it.

您通常会修复通过重写IsInputKey(),但不会工作,如果表单中存在的控件。如果设置键preVIEW为真,他们可能会做。该形式永远不会获得焦点,控件做。你需要放弃对关键preVIEW,这是一个古老的VB6不合时宜,无论如何,你通过覆盖ProcessCmdKey抓住光标键()。像这样的:

You'd normally fix that by overriding IsInputKey() but that won't work if the form has any controls. They probably do if you set KeyPreview to true. The form never gets the focus, the controls do. You need to give up on KeyPreview, it's an old VB6 anachronism anyway, you catch the cursor keys by overriding ProcessCmdKey(). Like this:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
    If keyData = Keys.Left Then
        Console.WriteLine("left")
        Return True
    End If
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

这篇关于表格的KeyEvent只能结合CTRL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆