【问题标题】:WPF c# Detect which keyboard sent through a key press (to detect if it was barcode scanner)WPF c#检测通过按键发送的键盘(检测它是否是条形码扫描仪)
【发布时间】:2014-01-08 17:36:46
【问题描述】:

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

但是我想知道是否有其他方法可以做到这一点。

我参加了 KeyEventArgs

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    this.TextBlock1.Text = e.KeyboardDevice.ToString();
}

我认为 e.KeyboardDevice 可能会给我一些关于哪个“键盘”的信息,例如标准键盘或“usb 条形码扫描仪键盘”,但我似乎找不到任何信息。

我只是认为可能有一种比从条形码扫描仪发送特殊组合键并使用它更简洁的方法。

【问题讨论】:

标签: c# wpf


【解决方案1】:

我认为 Id 贡献了我的解决方案。它不是那么优雅,但它只查找数字按键,然后查看响应所需的时间。如果时间长于最大阈值,则它会从数组中抛出这些值。我希望这对某人有所帮助。

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;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2012-04-04
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多