从第二个键盘重定向键盘输入

时间:2012-12-17 22:40:01

标签: c# .net usb hid

我正处于开发现有POS程序的配套应用程序的初始阶段。基本上我正在寻找类似功能的pin pad。我们有一个Targus USB数字键盘,希望客户可以输入密码。 (这不是支付系统,只是客户帐户验证)。主POS程序将运行,但我需要我的应用程序在后台运行并等待输入PIN,然后进行身份验证。

可能的解决方案#1: 我从Code Project下载了一个示例项目,该项目通过VID& amp ;; PID。这将是完美的,但键盘在某种程度上受Windows保护,无法以这种方式访问​​。有没有办法在Windows中“取消保存”键盘,这样它仍然是一个HID设备,但不被视为键盘?

可能的解决方案#2: 有键盘挂钩的样本,但这些都不会工作,因为键盘输出仍将转到POS应用程序。无论什么程序有焦点,我都需要键盘输出才能进入我的后台应用程序。有没有办法将输出从特定键盘重定向到特定应用程序?

这将推广到远程位置的100多个POS终端,因此不需要重新配置窗口的解决方案将是更可取的。它还需要在C#.NET 2.0

2 个答案:

答案 0 :(得分:2)

我越过这座桥接了一次POS解决方案。我发现击键是击键是击键,简单明了。在没有编写自己的设备驱动程序的情况下,我无法找到实现此目的的方法。

因此,我们的方法只是在等待客户输入销钉时禁用收银员的输入访问,反之亦然,当收银员应该有输入访问权而不是客户时。

我知道这不是你想听到的答案,但它是我通过经验找到的答案。

修改: 需要探索的东西......直接处理COM端口非常简单。您可以考虑使用COM键盘设备而不是USB设备。这样可以更好地控制设备的输出。 COM是一个非常古老的技术,找到这些端口的POS机可能很难。这对我们来说不是一个选择,所以我们从未探索过它。

答案 1 :(得分:1)

您最好的选择是购买操纵杆“键盘”,以便您可以将设备(USB HID)作为非键盘/非鼠标读取(因为键盘和鼠标受操作系统限制,不可绕过,因为它被硬编码到设备管理中。)

我建议使用PI Engineering的键盘,因为他们的键盘可以注册为操纵杆。他们有自定义映射软件,模拟按下设备上的按键,在Windows消息队列中发送密钥(模拟键盘)。相反,您可以使用他们的SDK直接针对设备进行编程(因为每个键只是一个操纵杆按钮),并且不会干扰POS软件。

PI Engineering Programmable Keyboards

USB access description(如果链接死亡,下面列出的相关部分)

Microsoft Windows

Windows驱动程序开发工具包HID

Windows DDK HID API就像Apple HID Manager一样,它是一个复杂的低级API,可以很好地反映USB HID。程序可以访问或多或少的每个设备,包括输入和输出,除了键盘和鼠标,微软故意阻止这个API。与目前为止所涵盖的其他API不同,读取机制的性质使得在没有专用于从队列中读取事件的线程的情况下使用它非常困难。虽然乍一看似乎有必要购买Microsoft的驱动程序开发工具包才能使用此API,但可以将它与免费的MinGW工具一起使用。

在Windows中,设备插件和拔出事件的通知被发送到窗口句柄,因此为了接收它们,hidio对象需要它自己的(不可见)窗口,然后窗口可以接收通知。在当前实现中,对象在收到此类通知时会自动重建设备列表。此外,如果设备当前处于打开状态,它会检查设备是否仍处于连接状态或已被删除。

DirectInput的

Microsoft的DirectInput API提供了一个相对简单的界面,但代价是灵活性。它对USB HID设备类型的支持有限,主要针对最流行的游戏设备;在USB HID中,它只支持“通用桌面页面”。它确实提供对鼠标和键盘数据的访问,但不能作为单独的设备。如果连接了多个鼠标或键盘,则所有数据都集中在一个虚拟设备中。它支持强制反馈,但不支持任何其他输出类型。与Linux input.h一样,它有自己的简化事件方案,并且还会自动扩展一些传入数据,这可能会有问题。

Windows Raw Input

Raw Input是Windows XP中的一个新API,它是为了响应开发人员希望获得对键盘和鼠标的原始访问而提供的。这是从Windows上的鼠标和键盘获取原始数据的唯一方法。使用原始输入,可以获取任何USB HID设备的输入事件,但根本不支持输出。出于这个原因,我们尚未深入探索Raw Input,但我们可能会使用它来完全支持Windows上的键盘和鼠标。