【发布时间】: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=188 和 e.KeyCode=Oemcomma {188}。
处理这种情况的最佳方法是什么?我想使用“特殊”键,比如逗号,也许还有退格键。
还考虑 i8n:我的物理数字小键盘显示一个点 .,但按下时必须始终将其视为逗号 ,。
【问题讨论】:
-
为什么会有
If声明?当这可能返回错误时,我不能立即。 -
@paul 我只想处理我的表单中的键,它是所有可用键的子集。
-
但您肯定只调用
AddHandler获取表单上的键吗? -
不,处理程序不会为每个按下的单个键/按钮处理
KeyDown事件,它会处理 包含控件 的KeyDown事件(即在这种情况下是一个面板)。想一想:用户在表单级别按下键,否则他应该在“按下”之前将焦点设置在每个键上。我不是在谈论 Click 事件,它特定于每个键,而是关于用户在物理键盘上打字。 -
所以您的应用设计为接受来自触摸屏或键盘的输入,但仅在有相应的表单控件时才确认键盘击键?
标签: vb.net keyboard-events keycode