【发布时间】:2012-10-10 19:10:44
【问题描述】:
我要做的是处理最终用户用他的手掌、拳头、脸等敲击键盘的事件。听起来很荒谬,但它将用作高功率激光实验室的补充安全功能.我正在考虑观看 4 个或更多键。有效组合示例:
- u{f5}7hby6
- 6g3.io{alt}mn'
- p9hyi
- {tab}2{f2}56{shift}z
- {alt}{windows}\{ctrl}{f8}
- basically anything else that can be typed with a face
我已经尝试过这种方法,但它不起作用,因为不是所有的 KeyUp 或 KeyDown 事件都得到处理,尤其是在按下多个键时。
Private keez As New List(Of Integer)
Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
keez.Add(e.KeyValue)
If keez.Count >= 4 Then MessageBox.Show("I handled it!")
End Sub
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
Try
keez.Remove(AscW(e.KeyChar))
Catch
End Try
End Sub
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
keez.Remove(e.KeyValue)
End Sub
使用这种方法,键会不断丢失。我想知道是否有人知道处理连续按下多个键的方法。大多数 Google 搜索都与标准组合键相关,这些组合键几乎总是包含一个修饰符(ctrl、alt、shift)+ 一个附加键。
【问题讨论】:
-
我在工业系统上做了很多工作(这些系统的风险与激光实验室一样多——过去也曾在这些系统中工作),但我从未采用过这种策略。我建议任何可能危险的意外输入都需要一个适当复杂和深思熟虑的动作 - 确认对话框等。对于一个功能(极端不需要通过意外输入发生)我什至生成了一个随机的 4 位数用户在开始操作之前必须正确复制的 pin。
-
另一个安全措施是必须按住一个键一段确定的时间(而不是瞬时按下)。在此期间,您可以验证是否没有按下其他键(即:等待时间内的任何其他键事件都会取消第一个)
-
J,感谢您的意见。为了清楚起见,我应该包括术语“E-STOP”。除了激光附近的硬 E-STOP 之外,这将是一个软 E-STOP。用户应该只能使用这种方法禁用激光。启用激光有一种更复杂的深思熟虑的方法。
-
hrm...如果您需要另一个 E-STOP,我可能会安装另一个硬 E-STOP。急停盒和电线价格便宜、可见度高且非常可靠。以上不靠谱。您至少必须确保您的程序保持焦点并禁用 windows 键(首先将其捣碎会破坏这一点)。
-
我的 CEO 提出了要求,在这个特别的初创公司,我们试图尽可能少地反对他 :)