gpt4 book ai didi

c# - 仅允许条形码扫描器并消除键盘输入

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:50 25 4
gpt4 key购买 nike

我制作了一个带有文本框的 Windows 窗体应用程序,该应用程序使用条码扫描器获取任何输入值。我希望用户仅使用 Barcode Scanner 来填充其中的任何值,并且不想使用我的常规键盘输入任何内容。

由于我的条形码模仿键盘工作,所以禁用我的常规键盘也会使我的条形码扫描器无法工作。

我搜索了很多地方来实现这一点,发现很少有答案建议添加一个秒表/计时器来消除在 50 毫秒内发生的所有按键,因为条形码可以在 50 毫秒内扫描所有值,但没有人可以打字比50 毫秒。

我也尝试过这种方式,但是当我随机用手指敲击键盘按键时失败了,它会读出一些按键在 50 毫秒内触发。

也试过下面的代码,但即使这样也不能像我预期的那样工作

private void rtBoxInput_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
}

请提出一些实现此目的的好方法?

最佳答案

基本思想是检查:

如果 KeyUp 和 KeyDown 事件在指定时间(例如 17 毫秒)内由相同的键触发,因为这只能使用条形码扫描仪来完成。

任何人都不能在 17 毫秒内触发同一个键的 KeyDown 和 KeyUp 事件。例如,某人按下和释放同一个键需要超过指定的时间,但是他可以击打键盘将多个键一起按下并触发他们的 KeyDown 和 KeyUp 事件,但所有没有键的人都会有 KeyUp 和 KeyDown 事件同步发射。因此,通过这种方式,您可以检测输入是由普通键盘还是条形码扫描器进行的。

请看下面:

public partial class BarcodeReader : Form
{

char cforKeyDown = '\0';
int _lastKeystroke = DateTime.Now.Millisecond;
List<char> _barcode = new List<char>(1);
bool UseKeyboard = false;
public BarcodeReader()
{
InitializeComponent();
}
private void BarcodeReader_Load(object sender, EventArgs e)
{
this.KeyDown += new KeyEventHandler(BarcodeReader_KeyDown);
this.KeyUp += new KeyEventHandler(BarcodeReader_KeyUp);
}
private void BarcodeReader_KeyUp(object sender, KeyEventArgs e)
{
// if keyboard input is allowed to read
if (UseKeyboard && e.KeyData != Keys.Enter)
{
MessageBox.Show(e.KeyData.ToString());
}

/* check if keydown and keyup is not different
* and keydown event is not fired again before the keyup event fired for the same key
* and keydown is not null
* Barcode never fired keydown event more than 1 time before the same key fired keyup event
* Barcode generally finishes all events (like keydown > keypress > keyup) of single key at a time, if two different keys are pressed then it is with keyboard
*/
if (cforKeyDown != (char)e.KeyCode || cforKeyDown == '\0')
{
cforKeyDown = '\0';
_barcode.Clear();
return;
}

// getting the time difference between 2 keys
int elapsed = (DateTime.Now.Millisecond - _lastKeystroke);

/*
* Barcode scanner usually takes less than 17 milliseconds as per my Barcode reader to read , increase this if neccessary of your barcode scanner is slower
* also assuming human can not type faster than 17 milliseconds
*/
if (elapsed > 17)
_barcode.Clear();

// Do not push in array if Enter/Return is pressed, since it is not any Character that need to be read
if (e.KeyCode != Keys.Return)
{
_barcode.Add((char)e.KeyData);
}

// Barcode scanner hits Enter/Return after reading barcode
if (e.KeyCode == Keys.Return && _barcode.Count > 0)
{
string BarCodeData = new String(_barcode.ToArray());
if (!UseKeyboard)
MessageBox.Show(String.Format("{0}", BarCodeData));
_barcode.Clear();
}

// update the last key press strock time
_lastKeystroke = DateTime.Now.Millisecond;
}

private void BarcodeReader_KeyDown(object sender, KeyEventArgs e)
{
//Debug.WriteLine("BarcodeReader_KeyDown : " + (char)e.KeyCode);
cforKeyDown = (char)e.KeyCode;
}
}

检查这里.. GitHub Link

关于c# - 仅允许条形码扫描器并消除键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50464858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com