0

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2012-12-17T23:28:31.053 回答
1

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

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

PI Engineering 可编程键盘

USB 访问描述(下面列出的相关部分,以防链接失效)

微软Windows

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 上的键盘和鼠标。

于 2012-12-17T23:45:52.003 回答