C#.NET-检测和处理“扩展的” USB HID键盘代码

时间:2019-06-18 14:57:13

标签: c# .net keyboard hid

我正在寻找检测和处理USB HID键盘中超出“正常”密码集即I.E. .NET WinForms应用程序(.NET Framework 4.5)中的100(0x64)以上的代码。特别是在我的情况下,我需要检测0x68到0x78之间的代码,但我希望能够检测到0xA4以下的任何内容,这似乎是HID键盘代码的上限(除了Ctrl,Alt,Win等功能之外)等)

这个问题Here似乎正是我想要的,但是我没有成功地获得有关该答案的建议。我已将窗体的KeyPreview设置为true,并为KeyDown,KeyPress和PreviewKeyDown注册了事件处理程序,但是在接收到0x68(F13)代码时都不会触发它们。现在,我只想将按下的键打印到Richtextbox控件中:

    public mainFrm()
    {
        InitializeComponent();
        this.KeyPreview = true;
        this.KeyDown += new KeyEventHandler(KeyDownHandler);
        this.KeyPress += new KeyPressEventHandler(KeyPressHandler);
        this.PreviewKeyDown += new PreviewKeyDownEventHandler(PreviewKeyHandler);
    }

    private void KeyPressHandler(object sender, KeyPressEventArgs e)
    {
        rtb_hidLog.AppendText("Press: " + e.KeyChar.ToString() + "\r\n");
    }

    private void KeyDownHandler(object sender, KeyEventArgs e)
    {
        rtb_hidLog.AppendText("KeyDown: "+ e.KeyCode.ToString() + "\r\n");
    }

    private void PreviewKeyHandler(object sender, PreviewKeyDownEventArgs e)
    {
        rtb_hidLog.AppendText("Preview: " + e.KeyCode.ToString() + "\r\n");
    }

我什至尝试覆盖ProcessCmdKey(根据this问题),并且也不会在0x68上触发:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        rtb_hidLog.AppendText("CmdKey: " + keyData.ToString() + "\r\n");
        return base.ProcessCmdKey(ref msg, keyData);
    }

我连接了一个USB HID键盘设备(作为HID键盘的PSoC微控制器),当我按一个按钮时会发送0x68(F13)键盘代码,但是不会触发PreviewKeyHander。来自PSoC器件的标准“ A”代码(0x04)可以毫无问题地触发KeyDownHandler和KeyPressHandler事件。我已通过USB分析仪确认0x68代码已正确发送,我似乎无法强迫.NET识别它并触发事件。是我缺少什么东西还是需要采取措施来迫使我的应用程序在这些代码上触发事件?

[编辑] 我现在也尝试使用Interop来使用win32 API(User32.dll)挂接到键盘输入,这也行不通。结果相同,钩住事件将为键盘上的所有键触发,但不在该范围内的任何事件都不会触发键按下事件。

[编辑2] 令我惊讶的是,如果那里存在一些问题,我可能还应该为键盘设备发布我的USB HID描述符:

enter image description here

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用键盘拦截器“在您的应用程序中引用的单独的dll项目中”,由Form这样使用

NoScrollbar