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

C# 从第二个键盘重定向键盘输入,c#,.net,usb,hid,C#,.net,Usb,Hid,我正处于开发现有POS程序配套应用程序的初始阶段。基本上,我正在寻找引脚垫一样的功能。我们有一个Targus USB数字键盘,希望客户可以使用它输入PIN码。(这不是针对支付系统,只是针对客户帐户验证)。主POS程序将运行,但我需要我的应用程序在后台运行,并等待输入PIN,然后进行身份验证 可能的解决方案#1: 我从代码项目下载了一个示例项目,该项目通过VID&PID处理usbhid设备。这将是完美的,但键盘不知何故受到Windows的保护,无法通过这种方式访问。有没有办法在Windows中“取

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

可能的解决方案#1: 我从代码项目下载了一个示例项目,该项目通过VID&PID处理usbhid设备。这将是完美的,但键盘不知何故受到Windows的保护,无法通过这种方式访问。有没有办法在Windows中“取消保留”键盘,使其仍然是HID设备,但不被视为键盘

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


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

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

因此,我们的方法只是在等待客户输入pin时禁用出纳的输入访问权限,反之亦然,出纳应该具有输入访问权限而不是客户

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

编辑
要探索的东西。。。直接处理COM端口非常简单。而不是USB设备,你可以考虑一个COM键盘设备。这将使您能够更好地控制设备的输出。COM是一项非常古老的技术,要找到具有这些端口的POS机可能很困难。这对我们来说不是一个选择,所以我们从未探索过。我曾经为了POS解决方案跨越了这座桥。我发现击键就是击键,简单明了。如果没有编写自己的设备驱动程序,我就无法找到实现这一点的方法

因此,我们的方法只是在等待客户输入pin时禁用出纳的输入访问权限,反之亦然,出纳应该具有输入访问权限而不是客户

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

编辑
要探索的东西。。。直接处理COM端口非常简单。而不是USB设备,你可以考虑一个COM键盘设备。这将使您能够更好地控制设备的输出。COM是一项非常古老的技术,要找到具有这些端口的POS机可能很困难。这不是我们的选择,因此我们从未对此进行过探索。

您最好的选择是购买一个操纵杆“键盘”,这样您就可以以非键盘/非鼠标的方式读取设备(USB HID)(因为键盘和鼠标受操作系统限制,无法绕过,因为它硬编码到设备管理中。)

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

(如果链路死亡,请参见下面列出的相关章节)

Microsoft Windows

Windows驱动程序开发工具包

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

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

直接输入

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

Windows原始输入

Raw Input是Windows XP中的一个新API,它是为了响应开发者对键盘和鼠标的原始访问而提供的。这是获得生食的唯一途径