首页 文章

用于C#和WPF的高级全局键盘钩,用于读取键盘楔形卡扫描器

提问于
浏览
0

.NET托管代码支持的唯一键盘钩是低级键盘钩子(WH_KEYBOARD_LL) .

Using global keyboard hook (WH_KEYBOARD_LL) in WPF / C#

我现在在我的应用程序中使用上面的代码,这样当您刷卡时,您将获得所有按键的列表 . 问题是键入分隔符字符,如“%”和“;”它会送我Alt Numpad吗?与这些符号对应的WPF Key对象 .

我的问题:有没有办法使这个行为更高级,即捕获从所有键盘命令生成的字符串?

干杯!

2 回答

  • 0

    不知道发生了什么,但是从键盘钩子中获得像%这样的角色是非常不重要的 . 挂钩仅通知您虚拟键 . 但%是键入键,通过按键盘上的Shift 5(美国版面)生成 . Windows通常通过处理WM_KEYDOWN / UP消息来生成这些字符,从而为键入密钥生成WM_CHAR消息 . 在你的情况下,这不会发生 . 执行此操作的低级Windows功能是ToUnicodeEx() .

  • 0

    我想如果你正在刷卡,wpf表单上有一个输入,例如文本框?然后我倾向于添加一个事件,也许是一个KeyUp事件处理程序,(键盘楔形卡扫描仪会发送一个处理结束信号,如ENTER,表示刷卡成功是吗?),在KeyUp事件处理程序中,使用StringBuilder构建一个字符串,当捕获到诸如ENTER之类的处理结束信号时,您可以删除“%”和“;”从StringBuilder实例中,做任何与它有关的事情 .

    使用状态系统可能更容易,当KeyUp事件处理程序收到“%”时,然后进入另一个状态,其中结束预期状态将是“;”

    static bool StartState = false;
    StringBuilder sbInput = new StringBuilder();
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
       if (!StartState){
        if (e.KeyCode == Keys.D5) StartState = true;
        sbInput.Append((char)e.KeyValue);
       }else{
        if (e.KeyCode == Keys.OemSemicolon){
           StartState = false;
           // sbInput will contain the data from the scanner,
           // copy it somewhere else and reset sbInput
           // sbInput.Remove(0, sbInput.Length); 
        }
        sbInput.Append((char)e.KeyValue);
       }
       e.Handled = true;
    }
    

    希望这会有所帮助,最好的问候,汤姆 .

相关问题