WPF c#检测通过按键发送的键盘(检测是否为条形码扫描仪)

WPF c#检测通过按键发送的键盘(检测是否为条形码扫描仪),c#,wpf,C#,Wpf,我有一个USB条形码扫描仪连接。 我目前正在检测按键是否通过键盘从它发送到文本框,方法是让它在发送条形码之前发送一个特殊的组合键 然而,我想知道是否有其他方法可以做到这一点 我参加了KeyEventArgs private void TextBox_KeyUp(object sender, KeyEventArgs e) { this.TextBlock1.Text = e.KeyboardDevice.ToString(); } 我想e.KeyboardDevice可能会给我一些关于

我有一个USB条形码扫描仪连接。 我目前正在检测按键是否通过键盘从它发送到文本框,方法是让它在发送条形码之前发送一个特殊的组合键

然而,我想知道是否有其他方法可以做到这一点

我参加了KeyEventArgs

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方法来解决此问题。如果您认为解决此问题的答案是正确的,则应将此问题标记为另一个问题的重复,而不是使用指向另一个问题的链接