【问题标题】:Determining which keyboard is sending keystrokes确定哪个键盘正在发送击键
【发布时间】:2010-11-23 04:40:08
【问题描述】:

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

【问题讨论】:

  • 它们都不起作用?通常这不是一个或另一个情况(除非 PS2 在启动时没有插入)
  • 我有两个 USB 设备,一个键盘和一个模拟键盘的条形码扫描仪。我很想知道哪个是哪个。

标签: c# keyboard


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我是条码扫描仪;这不是原始问题的一部分。
      【解决方案4】:

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

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

      限制:

      1. 您不能在应用外使用粘连键盘,因为只有它知道忽略修饰键。
      2. 您不能在自己的应用中使用这些修饰键作为键盘快捷键的一部分。
      3. 如果用户按住正确的按钮,另一个键盘可能会模仿您的键盘(无论是否意外)。
      4. 您需要禁用粘滞键。
      5. 使用 Alt 或 Ctrl 有不利的一面:如果您按下 other 一个,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

      【讨论】:

        【解决方案5】:

        这是一个非常脏的示例代码,展示了如何使用 .NET 中的 windows 输入挂钩。与 Snippet Compiler 配合使用效果最佳:>

        编辑:原来帖子有长度限制,

        grab the source from code here

        .

        【讨论】:

        • 非常感谢!这个工作正常,但我需要很多时间才能理解它是如何工作的:)
        • 链接已失效 - archived version here
        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 2021-07-26
        • 2012-08-28
        • 1970-01-01
        • 2011-08-03
        • 2017-11-16
        • 1970-01-01
        • 2011-08-30
        相关资源
        最近更新 更多