使用场景描述
最近为公司开发一个生产操作系统,其中用到扫描枪输入条码,结果发现手头的扫描枪是模拟键盘输入将条码数据直接发送到焦点控件中的(USB口的),比如TextBox,而由于业务要求,不允许生产线上员工手工输入和用鼠标复制粘贴,因此我将文本框设为只读,想不到扫描枪也无法输入了。
看来想通过控件的键盘事件去识别扫描枪输入与键盘输入是行不通的。百度了下,也没找到好的解决方案,不过得到了一个通过检测按键间隔来识别是否为人工输入的思路,但是以时间间隔判断只能限制输入如果现场操作用户使用Ctrl+C,Ctrl+V,或者用鼠标按键复制粘贴就跨过时间的验证了,经过多番研究和调试,终于完成了功能。
基本思路为:使用时间类型变量记录每次按键发生时间,计算两次按键之间的时间间隔,如果超时,则认为是键盘输入,间隔限定50毫秒,因为扫描仪输入间隔非常快,以此区分并且限制不能在TextBox文本框中不能Ctrl+C,Ctrl+V和用鼠标复制粘贴。
代码
private void TxtBarCode_KeyPress(object sender, KeyPressEventArgs e)
{
txtBarCode.KeyPress -= TxtBarCode_KeyPress;
try
{
e.Handled = IsPaste;
}
finally { txtBarCode.KeyPress += TxtBarCode_KeyPress; }
}
bool IsPaste = false;