WPF c#检测通过按键发送的键盘(检测是否为条形码扫描仪)
我有一个USB条形码扫描仪连接。 我目前正在检测按键是否通过键盘从它发送到文本框,方法是让它在发送条形码之前发送一个特殊的组合键 然而,我想知道是否有其他方法可以做到这一点 我参加了KeyEventArgsWPF c#检测通过按键发送的键盘(检测是否为条形码扫描仪),c#,wpf,C#,Wpf,我有一个USB条形码扫描仪连接。 我目前正在检测按键是否通过键盘从它发送到文本框,方法是让它在发送条形码之前发送一个特殊的组合键 然而,我想知道是否有其他方法可以做到这一点 我参加了KeyEventArgs private void TextBox_KeyUp(object sender, KeyEventArgs e) { this.TextBlock1.Text = e.KeyboardDevice.ToString(); } 我想e.KeyboardDevice可能会给我一些关于
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
this.TextBlock1.Text = e.KeyboardDevice.ToString();
}
我想e.KeyboardDevice可能会给我一些关于哪个“键盘”的信息,例如标准键盘或“usb条形码扫描仪键盘”,但我似乎找不到这些信息
我只是觉得有一种更简洁的方法可以做到这一点,而不是从条形码扫描仪发送特殊的组合键并使用它
过去我用这个答案解决过同样的问题。答案包含一个链接,其中包含有关解决方案的完整详细信息 我想我会贡献我的解决方案。它并没有那个么优雅,但它只会寻找数字按键,然后查看响应所需的时间。如果时间长于最大阈值,则会从数组中抛出这些值。我希望这对某人有帮助
class BarcodeReader
{
ArrayList barCode = new ArrayList();
ArrayList barCodeTimes = new ArrayList();
ArrayList barCodeDeltaTimes = new ArrayList();
/// <summary>
/// Input 1: delayTime (ms) - time for scanner to return values (threshold)[30 seems good],
/// Input 2: KeyEventArgs - put in key [this.KeyDown += new KeyEventHandler(Form1_KeyDown)],
/// Output 1: String of barcode read
/// </summary>
/// <param name="delayTime"></param>
/// <param name="e"></param>
/// <returns></returns>
public string BarcodeValue(int delayTime, KeyEventArgs e)
{
string barCodeString = null;
var isNumber = e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9;
var rtn = e.KeyCode == Keys.Enter;
if (isNumber)
{
barCode.Add(Encoding.ASCII.GetString(new byte[] { (byte)e.KeyValue }));
barCodeTimes.Add(DateTime.Now.TimeOfDay.TotalMilliseconds);
}
if (rtn)
{
barCodeString = ValuesToString(delayTime);
}
return barCodeString;
}
private string ValuesToString(int delayTime)
{
string barCodeString = null;
foreach (double d in barCodeTimes)
{
double diff = 0;
int index = barCodeTimes.IndexOf(d);
if (index < barCodeTimes.Count - 1)
{
diff = (double)barCodeTimes[index + 1] - (double)barCodeTimes[index];
}
barCodeDeltaTimes.Add(diff);
}
foreach (double d in barCodeDeltaTimes)
{
if (d > delayTime)
{
barCode.RemoveAt(0);
}
}
foreach (string s in barCode)
{
barCodeString += s;
}
barCode.Clear();
barCodeTimes.Clear();
barCodeDeltaTimes.Clear();
return barCodeString;
}
}
class条形码阅读器
{
ArrayList条码=新的ArrayList();
ArrayList条码时间=新的ArrayList();
ArrayList barCodeDeltaTimes=新的ArrayList();
///
///输入1:delayTime(毫秒)-扫描仪返回值的时间(阈值)[30似乎很好],
///输入2:KeyEventArgs-输入键[this.KeyDown+=newkeydeventhandler(Form1\u KeyDown)],
///输出1:读取的条形码字符串
///
///
///
///
公共字符串条形码值(int delayTime,KeyEventArgs e)
{
字符串barCodeString=null;
var isNumber=e.KeyCode>=Keys.D0&&e.KeyCode延迟时间)
{
条码删除(0);
}
}
foreach(条形码中的字符串s)
{
条码字符串+=s;
}
条形码。清除();
barCodeTimes.Clear();
barCodeDeltaTimes.Clear();
返回条码字符串;
}
}
可能重复的问题使人相信没有内置的.NET framework方法来解决此问题。如果您认为解决此问题的答案是正确的,则应将此问题标记为另一个问题的重复,而不是使用指向另一个问题的链接