【问题标题】:Redirect Keyboard input from second keypad从第二个键盘重定向键盘输入
【发布时间】:2012-12-17 22:40:00
【问题描述】:

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

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

可能的解决方案 #2: 有键盘钩子的示例,但这些都不起作用,因为键盘输出仍将进入 POS 应用程序。无论哪个程序有焦点,我都需要键盘输出只进入我的后台应用程序。有没有办法将特定键盘的输出重定向到特定应用程序?

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

【问题讨论】:

    标签: c# .net usb hid


    【解决方案1】:

    我曾经为 POS 解决方案穿过这座桥。我发现一个keystroke就是一个keystroke就是一个keystroke,简单明了。如果不编写您自己的设备驱动程序,我无法找到实现此目的的方法。

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

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

    编辑: 有待探索... 直接处理 COM 端口非常容易。您可以考虑使用 COM 键盘设备,而不是 USB 设备。这将使您更好地控制设备的输出。 COM 是一项相当古老的技术,要找到具有这些端口的 POS 机可能会很困难。这不是我们的选择,所以我们从未探索过。

    【讨论】:

    • 感谢您的建议,除了上面的 PI Products 链接外,我还开始查看实际的支付 Pin 键盘,这些有 USB 和 COM 风格,但我不确定它们的可编程性是在 LCD 显示屏和所需的加密级别方面。
    【解决方案2】:

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

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

    PI Engineering Programmable Keyboards

    USB access description(下面列出的相关部分,以防链接失效)

    微软视窗

    Windows 驱动程序开发工具包 HID

    Windows DDK HID API 类似于 Apple HID 管理器,它是一个复杂的低级 API,与 USB HID 非常相似。程序可以访问或多或少的所有设备,包括输入和输出,除了键盘和鼠标,微软故意阻止了这个 API。与迄今为止介绍的其他 API 不同,读取机制的性质使得如果没有专门用于从队列中读取事件的线程,则很难使用。虽然乍一看似乎需要购买 Microsoft 的驱动程序开发工具包才能使用此 API,但可以将其与免费的 MinGW 工具一起使用。

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

    直接输入

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

    Windows 原始输入

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

    【讨论】:

    • 我想没有办法告诉 Windows 小键盘只是一个 HID 设备,而不是专门的键盘?
    • 我应该说不编写自己的 Windows 驱动程序是不可能的。这并不是世界上最简单的事情,一旦完成,您就必须创建自己的方案来发送按键(消息队列、内存映射文件等)。
    • 再次感谢 Erik,我倾向于更昂贵但可能更简单的 PI 键盘路线。
    • 对它的工作原理感兴趣的人请查看Software Mode with a Custom Application
    • 我和一个比我更了解硬件编程的朋友聊天,在大约一个小时内,他能够为键盘编写自己的驱动程序,然后 Windows 使用该键盘作为 HID 设备安装.完美运行。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多