赞
踩
工作需要写了一个小程序,结合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)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。