【问题标题】:Multiple keyboards and low-level hooks多个键盘和低级挂钩
【发布时间】:2008-09-18 09:37:51
【问题描述】:

我有一个系统,我有多个键盘,并且确实需要知道击键来自哪个键盘。解释设置:

  1. 我有一台普通的 PC 和 USB 键盘
  2. 我有一个带有一些硬键的外部 VGA 屏幕
  3. 硬键映射为标准 USB 键盘,发送有限数量的键码(F1、F2、Return、+ 和 -)

我有一个低级挂钩(在 C# 中,但实际上调用 Win32 功能),即使我的应用程序没有获得焦点,它也能够处理输入。

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

我怎么知道是哪个键盘造成了按键?

【问题讨论】:

  • 我在这里回答了这个问题:How to detect the input device if mouse and touchpad are both enabled。答案使用我创建的 c 库和驱动程序。
  • 严格来说不是我的问题的答案。标记为正确的答案已经好几年了。
  • @ray-haves 您能否确认您是否能够阻止输入为其他应用程序制作,即使您已对其进行了过滤。也就是说,一旦通过原始输入过滤击键,您是否能够阻止它被操作系统的其余部分处理?
  • 对不起,错误的目标,@ray-hayes
  • @Chico,不,它不会阻止密钥传播到其他应用程序。但这不是我的问题的意图。我有一个特殊的硬件设备,它需要将其按键输入到应用程序(在单独的监视器上全屏显示),无论它是否被聚焦。当然,如果他们在专注于 Microsoft Word 时使用按键,他们将获得不寻常的结果 - 但碰巧,由于事物的物理设置方式,这并不是很像。虽然您的答案可能是 better ,但目前实施的答案很好! ;-)

标签: c# winapi keyboard hardware hook


【解决方案1】:

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

这是我弥补它的尝试:):

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

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

  • 注册设备后,您将开始收到 WM_INPUT 消息。

  • WM_INPUT 消息的 lParam 包含一个 RAWKEYBOARD 结构,您可以使用它来确定输入来自的键盘,以及虚拟键码和消息类型(WM_KEYDOWN、WM_KEYUP、...)

  • 因此,您可以设置最后一条消息的来源标志,然后将其分派给常规键盘输入处理程序。

【讨论】:

  • 我现在有类似的问题,我需要获得多个触摸事件。你碰巧有更详细的例子吗?
【解决方案2】:

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

【讨论】:

  • 哦,好吧,真可惜。我将与设备制造商联系,看看是否有办法让硬件刷新以使用不同的密钥代码(希望在高 VK_Fn 数字中)。
  • 不接受这一点,因为根据 A Nony Mouse 的回复,看起来没有驱动程序是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多