当前位置:   article > 正文

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

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)]

     

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号