【问题标题】:How to prevent specific keyboard inputing into TextBox in WPF如何防止特定键盘输入到 WPF 中的 TextBox
【发布时间】: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 我无法对我的条形码扫描仪进行编程。我只能认为它是一个通用键盘。

标签: c# wpf input


【解决方案1】:

我建议使用简单的文本框来读取各种键盘,并在条形码阅读器设备中激活,在解码条形码后通过 Enter 以便您可以读取它们的键盘和条形码阅读器数据。

【讨论】: