高级别全球键盘钩子为C#和WPF用于读取键盘口名片扫描仪
-
22-09-2019 - |
题
支持.NET唯一键盘钩子托管代码是一个低级键盘钩(WH_KEYBOARD_LL)。
请参阅使用全局键盘钩子(WH_KEYBOARD_LL)在WPF / C#
我上面的代码在我此刻的应用程序工作,所以,当你刷卡,你会得到所有的按键的列表。问题是打字分隔符如“%”和“;”它将给我ALT +数字键盘+? WPF键对象对应于这些码元。
我的问题:是否有某种方式使这个操作起来更高层,也就是捕获所有的键盘命令生成的字符串
干杯!
解决方案
不知道这是怎么回事,但得到像一个%字符出一个键盘钩子是非常untrivial。钩子仅通知您的虚拟键。但是,%是一个打字键,通过我的键盘(美国布局)上按Shift + 5生产。视窗通常通过处理WM_KEYDOWN / UP消息,生成用于打字密钥的WM_CHAR消息产生这些字符。那不是你的情况发生。低级别的Windows函数,它这是ToUnicodeEx()。
其他提示
如果你刷卡我猜想,还有的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; }
希望这有助于 最好的祝福, 汤姆。
不隶属于 StackOverflow