首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF c#检测通过按键发送的键盘(以检测是否为条形码扫描仪)

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

Stack Overflow用户
提问于 2014-01-09 01:36:47
回答 1查看 7.9K关注 0票数 0

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

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

我在KeyEventArgs拍的

代码语言:javascript
复制
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    this.TextBlock1.Text = e.KeyboardDevice.ToString();
}

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

我只是在想,可能有一种更好的方法来做这件事,而不是从条形码扫描仪发送特殊的键组合并使用它。

EN

回答 1

Stack Overflow用户

发布于 2016-02-29 13:42:57

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

代码语言:javascript
复制
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;
    }

}
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21002657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档