【发布时间】:2025-12-11 06:45:01
【问题描述】:
我有一个带有两个 HID 键盘的系统(实际上是一个条形码扫描仪。)。我注册设备('条形码扫描仪')以读取raw input data。
我将RIDEV_NOLEGACY | RIDEV_INPUTSINK 设置为RAWINPUTDEVICE 的dwFlags。然后我可以在我的代码中读取和处理原始输入数据。
但是,因为我设置了RIDEV_NOLEGACY dwFlags,另一个通用键盘无法在 XAML 上的 TextBox 中输入任何内容。那不是我想要的。我只是想防止条码扫描器直接进入文本框,而不是所有的键盘。
以下是代码示例(需要安装nuget包'sharplibhid'):
private SharpLib.Hid.Handler iHidHandler;
private void Window1_Loaded(object sender, RoutedEventArgs e)
{
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[1];
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x06;
rid[0].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK | RawInputDeviceFlags.RIDEV_NOLEGACY;
rid[0].hwndTarget = source.Handle;
iHidHandler = new SharpLib.Hid.Handler(rid);
iHidHandler.OnHidEvent += HandleHidEventThreadSafe;
}
public void HandleHidEventThreadSafe(object aSender, SharpLib.Hid.Event aHidEvent)
{
if (aHidEvent.IsStray)
{
//Stray event just ignore it
return;
}
else
{
// do something...
if (aHidEvent.Device.ProductId == xxx && aHidEvent.Device.VendorId == xxx)
{
Debug.WriteLine(aHidEvent.VirtualKey.ToString());
}
}
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
Message message = Message.Create(hwnd, msg, wParam, lParam);
switch (msg)
{
case Const.WM_INPUT:
iHidHandler.ProcessInput(ref message);
handled = true;
break;
}
return IntPtr.Zero;
}
【问题讨论】:
-
这可能会有所帮助:*.com/questions/587840/….
-
在我的应用程序中,我使用前缀和后缀来包围条形码输入,以区别于键盘输入。确定来源后,您可以决定是否将其扔掉或保留在文本框中
-
@anonymousCoder 不幸的是,我的条形码扫描仪被系统识别为 HID 键盘。因此,UWP API 可能无法正常工作。
-
看看我的回答,*.com/questions/56619941/… 你遇到的问题很相似,我猜你的条形码阅读器是否支持前缀和后缀按键
-
@GurhanPolat 我无法对我的条形码扫描仪进行编程。我只能认为它是一个通用键盘。