0

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

请参阅在 WPF / C# 中使用全局键盘挂钩 (WH_KEYBOARD_LL)

目前,我的应用程序中有上述代码,因此当您刷卡时,您将获得所有击键的列表。问题在于键入分隔符,例如“%”和“;” 它会向我发送 Alt+Numpad+?这些符号对应的 WPF Key 对象。

我的问题:有没有办法让它表现得更高级,即捕获从所有键盘命令生成的字符串?

干杯!

4

2 回答 2

0

不知道发生了什么,但是从键盘钩子中获取像 % 这样的字符是非常重要的。该挂钩仅通知您虚拟键。但是 % 是一个打字键,通过在我的键盘上按 Shift + 5 产生(美国布局)。Windows 通常通过处理 WM_KEYDOWN/UP 消息来生成这些字符,为键入键生成 WM_CHAR 消息。在你的情况下没有发生这种情况。执行此操作的低级 Windows 函数是 ToUnicodeEx()。

于 2010-01-26T02:23:43.333 回答
0

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

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

静态布尔 StartState = false;
StringBuilder sbInput = new StringBuilder();
私人无效文本框1_KeyUp(对象发送者,KeyEventArgs e)
{
   如果(!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }别的{
    if (e.KeyCode == Keys.OemSemicolon){
       开始状态 = 假;
       // sbInput 将包含来自扫描仪的数据,
       // 将其复制到其他地方并重置 sbInput
       // sbInput.Remove(0, sbInput.Length);
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

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

于 2010-01-26T02:32:40.863 回答