C# 多输入设备识别 扫码枪键盘区分RAWINPUT原始输入简易开发笔记

工作需要写了一个小程序,结合cefsharp利用erp软件的api进行二次开发,实现定制功能。软件会用到扫码枪扫描快递单号发货。会用到蓝牙电子称称重。还会遇到快递拆单快速新建订单并打印订单,也需要用到扫码枪扫描快递单,然后新建指定数量新的快递单。开发中遇到很多问题。比如,扫码枪会认定为keyboard。蓝牙接收器也会认定为keyboard。加上自身的键盘。这么多的输入设备,如果遇到2个或者2个以上输入设备同时输入就会产生干扰。不能同时输入。针对这个问题,查了很多资料发现rawinput原始输入才是解决这个问题的关键。接下来会结合开发代码进行记录。

一、我遇到的第一个问题如何识别是扫码枪输入的快递单号。还是键盘输入的信息。

网上有人的给出的解决方案是利用键盘钩子,记录键盘的按键keypress事件或者keydown事件的时间间隔。一般设置50毫秒。会认为是扫码枪的输入。因为人工输入达不到这么快的速度。虽然我也这样做了,也可以区分是扫描枪还是键盘输入了。但实际使用的时候还是会产生冲突的情况。遇到了rawinput之后这个问题就非常简单了。原始输入得到的信息里包括了输入设备的信息,这样通过识别设备的信息来区分不同的设备。

 private const int RIDEV_INPUTSINK = 0x100;
 private const int RIDEV_NoLegacy = 0x30;

 private const int WM_INPUT = 0x00FF;
 private const uint RID_INPUT = 0x10000003;
 private const uint RIDI_DEVICENAME = 0x20000007;

 private const string HoneywellScanning = @"HID#VID_0C2E&PID_0204";

 StringBuilder 创建订单扫码枪 = new StringBuilder();

[StructLayout(LayoutKind.Sequential)]
        internal struct RAWINPUTDEVICE

        {

            [MarshalAs(UnmanagedType.U2)]

            public ushort usUsagePage;

            [MarshalAs(UnmanagedType.U2)]

            public ushort usUsage;

            [MarshalAs(UnmanagedType.U4)]

            public int dwFlags;

            public IntPtr hwndTarget;

        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct RAWINPUTHEADER

        {

            [MarshalAs(UnmanagedType.U4)]

            public int dwType;

            [MarshalAs(UnmanagedType.U4)]

            public int dwSize;

            public IntPtr hDevice;

            [MarshalAs(UnmanagedType.U4)]

            public int wParam;

        }

        [StructLayout(LayoutKind.Explicit)]
        internal struct RAWINPUT

        {

            [FieldOffset(0)]

            public RAWINPUTHEADER header;

            [FieldOffset(16)]

            public RAWMOUSE mouse;

            [FieldOffset(16)]

            public RAWKEYBOARD keyboard;

            [FieldOffset(16)]

            public RAWHID hid;

        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct RAWKEYBOARD

        {

            [MarshalAs(UnmanagedType.U2)]

            public ushort MakeCode;

            [MarshalAs(UnmanagedType.U2)]

            public ushort Flags

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,可以通过监听键盘事件和鼠标事件来判断字符输入的来源。当用户通过键盘输入字符时,会触发键盘事件;而当用户通过扫码输入字符时,会触发鼠标事件。 具体实现方法如下: 1. 监听键盘事件 可以使用C#中的KeyPress事件来监听键盘输入。当用户按下键盘上的任意一个键时,都会触发该事件。在事件处理方法中,可以判断输入的字符是否是扫码输入的字符。 示例代码: ```csharp private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') { // 判断是否是扫码输入的字符 if (textBox1.Text.StartsWith("SC")) { // 是扫码输入的字符 // 处理扫码输入的数据 } else { // 是键盘输入的字符 // 处理键盘输入的数据 } } } ``` 2. 监听鼠标事件 可以使用C#中的MouseDown事件来监听鼠标输入。当用户通过扫码输入字符时,会触发鼠标的左键按下事件。在事件处理方法中,可以判断输入的字符是否是扫码输入的字符。 示例代码: ```csharp private void textBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // 判断是否是扫码输入的字符 if (textBox1.Text.StartsWith("SC")) { // 是扫码输入的字符 // 处理扫码输入的数据 } else { // 是键盘输入的字符 // 处理键盘输入的数据 } } } ``` 以上是两种常见的判断字符输入来源的方法,根据实际情况选择适合自己的方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值