【问题标题】:.NET KeyDown event to handle KeyChars.NET KeyDown 事件来处理 KeyChars
【发布时间】:2013-01-21 10:20:48
【问题描述】:

我为触摸屏应用程序制作了一个表示数字键盘的表单,它包含键 0123456789 以及逗号 , 键。每个键都是一个自定义控件的实例,具有我在设计时设置的名为 Key 的属性:

   <Browsable(True),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    Private _key As Char
    Property Key As Char
        Get
            Return _key
        End Get
        Set(value As Char)
            _key = value
            Me.Text = _key
        End Set
    End Property

为了轻松找到按下的键,我在包含表单中构建了一个包含所有键的HashSet

Private keys As HashSet(Of Char)
....
For Each c As Control In ...
   keys.Add(...)
Next

然后我监听KeyDown事件:

AddHandler Me.KeyDown, AddressOf KeyHasBeenPressed

然后在处理程序中:

Private Sub KeyHasBeenPressed(sender As Object, e As KeyEventArgs)

    If keys.Contains(ChrW(e.KeyValue)) Then
        ' handle the key pressed event...
    End If

End Sub

问题在于逗号, 键。 Key 属性已在设计器中设置为 ,,但在运行时测试 keys.Contains 失败,因为 e.KeyValue=188e.KeyCode=Oemcomma {188}

处理这种情况的最佳方法是什么?我想使用“特殊”键,比如逗号,也许还有退格键。

还考虑 i8n:我的物理数字小键盘显示一个点 .,但按下时必须始终将其视为逗号 ,

【问题讨论】:

  • 为什么会有If 声明?当这可能返回错误时,我不能立即。
  • @paul 我只想处理我的表单中的键,它是所有可用键的子集。
  • 但您肯定只调用AddHandler 获取表单上的键吗?
  • 不,处理程序不会为每个按下的单个键/按钮处理 KeyDown 事件,它会处理 包含控件KeyDown 事件(即在这种情况下是一个面板)。想一想:用户在表单级别按下键,否则他应该在“按下”之前将焦点设置在每个键上。我不是在谈论 Click 事件,它特定于每个键,而是关于用户在物理键盘上打字。
  • 所以您的应用设计为接受来自触摸屏或键盘的输入,但仅在有相应的表单控件时才确认键盘击键?

标签: vb.net keyboard-events keycode


【解决方案1】:

如果您使用KeyPress 而不是KeyDown,那么您将能够使用KeyPressEventArgsKeyChar 属性,它应该返回一个','

【讨论】:

  • 它可以工作,但是:1) 它不能处理像退格这样的特殊键和 2) 它不能解决在数字键盘中将 . 转换为 , 的问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2011-10-12
  • 2021-07-23
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多