确定哪个键盘正在发送击键

我有2个键盘连接到我的机器上(一个在PS / 2上,另一个在USB上)。 我如何确定哪个键盘在C#中发送击键?

这是一个示例,非常脏的代码,显示如何使用.NET的Windows输入挂钩。 最适合使用Snippet Compiler:>

编辑:结果是post的长度限制,

从这里的代码中获取源代码

如果一个是USB,那么你应该能够弄清楚 – 至少在驱动程序级别上。 但是,堆叠越高,我就没有听说过这样的选择。 如果根本不可能,我不会感到惊讶。

您可能想要查看的一个途径是舞蹈模拟器。 你知道,那些带有“跳舞垫”(或“跳舞垫”)的人。 这些舞蹈垫实际上只不过是大键盘。 自己检查一下 – 打开记事本,跳上跳舞毯。 🙂

现在,其中一些程序也提供竞争模式,你可以连接两个舞蹈垫并与合作伙伴竞争。 在这种情况下,他们需要以某种方式区分垫子 – 这与您尝试做的事情是一样的。

我猜测问题是,当使用条形码扫描仪时,数字是进入活动字段而不是条形码ID的字段?

一种解决方案是挂钩其他字段的OnChange事件并查找插入其中的条形码编号(通过RegEx)。 如果找到,请将条形码移出该字段,然后将值移到条形码字段。

无需设备访问,甚至可以在Javascript驱动的网页上完成。

好的,这是一个真正的 kludgy方法,只适用于非常有限的用例子集:

  1. 在其中一个键盘上粘贴,粘合或缩短一组修改键(例如右键)。
  2. 在每次按键时,查看修改器。 如果将修改器设置为胶合键盘上的修改器,则假设键盘是源。 如果没有,假设它是另一个键盘。

限制:

  1. 您不能在应用程序外使用粘合键盘,因为只有它知道忽略修改键。
  2. 您不能在自己的应用程序中使用这些修改键作为键盘快捷键的一部分。
  3. 如果用户按下正确的按钮,则另一个键盘可以冒充您的(意外与否)。
  4. 你需要禁用StickyKeys。
  5. 使用Alt或Ctrl有一个缺点:如果你按另一个 ,Windows可能会使用你的应用程序将无法捕获的组合。

未知#1 :ModifierKeys是仅从作为键击源的键盘填充,还是来自所有连接键盘上所有修饰符的总和。 我怀疑每个键盘在内部发送附加到击键的修饰符,并且Windows不会聚合它们。

未知#2 :System.Windows.Forms.Control.ModifierKeys是否提供Ctrl / Shift / Alt位,或提供足够的细节,例如,区分右Ctrl键与左侧。 以下是理论上可以测试的键,我不知道通过ModifierKeys提供了多少键:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

我认为你能做到的唯一方法就是监控USB流量。 我见过这样做的程序,但我不知道如何在C#中做到这一点。 因此,如果有USB流量和按键,那就是USB键盘。 如果没有流量,那就是PS / 2。

当然,另一个需要注意的是它不会推广到任意或未来的键盘连接类型。