C# 多键盘和低级挂钩

C# 多键盘和低级挂钩,c#,winapi,keyboard,hardware,hook,C#,Winapi,Keyboard,Hardware,Hook,我有一个系统,我有多个键盘,我真的需要知道键盘笔划是来自哪个键盘。要解释设置,请执行以下操作: 我有一台普通的电脑和USB键盘 我有一个外置VGA屏幕和一些硬键 硬键映射为标准USB键盘,发送有限数量的键代码(F1、F2、Return、+和-) 我有一个低级钩子(在C#中,但实际上调用了Win32功能),它能够处理输入,即使在我的应用程序没有集中的情况下 问题在于,当使用普通键盘时,外部屏幕上正在驱动的应用程序会拾取一些映射的按键代码。外部屏幕发送并用于确认的按键之一是VK_RETURN。除非我

我有一个系统,我有多个键盘,我真的需要知道键盘笔划是来自哪个键盘。要解释设置,请执行以下操作:

  • 我有一台普通的电脑和USB键盘
  • 我有一个外置VGA屏幕和一些硬键
  • 硬键映射为标准USB键盘,发送有限数量的键代码(F1、F2、Return、+和-)
  • 我有一个低级钩子(在C#中,但实际上调用了Win32功能),它能够处理输入,即使在我的应用程序没有集中的情况下

    问题在于,当使用普通键盘时,外部屏幕上正在驱动的应用程序会拾取一些映射的按键代码。外部屏幕发送并用于确认的按键之一是VK_RETURN。除非我能够识别“设备”并对其进行过滤,否则用户可能会在屏幕上执行操作并确认它们,而他们甚至都不看屏幕


    我如何知道哪个键盘负责按键?

    没有办法做到这一点。Windows为您抽象了这一点。如前所述,您需要编写/修改设备驱动程序。

    是的,我的错误得到纠正,每天都在学习新的东西

    这是我试图弥补的:):

    • 使用::RegisterRarWinPutDevices()注册要用于原始输入的设备(两个键盘)

    • 您可以从GetRawInputDeviceList()获取这些设备

    • 注册设备后,您将开始收到WM_输入消息

    • WM_输入消息的LPRAM包含一个RAW键盘结构,您可以使用该结构确定输入来自何处的键盘,加上虚拟键码和消息类型(WM_KEYDOWN、WM_keydup,…)

    • 因此,您可以设置最后一条消息来自何处的标志,然后将其发送到常规键盘输入处理程序


    哦,太遗憾了。我将联系设备制造商,看看是否有一种方法可以让硬件使用不同的按键代码(希望是高VK_Fn数字)。不接受这一点,因为根据Nony鼠标的回答,似乎没有驱动程序也是可能的。我在这里回答了这个问题:。答案使用了我创建的c库和驱动程序。严格来说,这不是我问题的答案。标记为“正确”的答案已经运行了好几年。@ray haves您能否确认您是否能够阻止为其他应用程序进行输入,即使您已经对其进行了筛选。也就是说,一旦一个击键被原始输入过滤掉,你能阻止它被操作系统的其他部分处理吗?对不起,目标不对,@ray-hayes@Chico,否,它不会阻止密钥传播到其他应用程序。但这不是我问题的目的。我有一个特殊的硬件设备,它需要将按键输入到一个应用程序(在一个单独的显示器上显示全屏),而不管它是否聚焦。当然,如果他们在使用MicrosoftWord时使用这些键,他们会得到不寻常的结果——但事实上,这与实际设置的方式不太一样。虽然您的答案可能会更好,但目前实施的解决方案效果良好!;-)我有类似的问题,现在我需要获得多个触摸事件。你有更详细的例子吗?