【问题标题】:Capture keyboard inputs without a textbox在没有文本框的情况下捕获键盘输入
【发布时间】:2013-01-01 02:25:00
【问题描述】:

我有一个应用程序,它从医疗卡中读取数据并解析它们以获取基本信息,例如 DOB、医疗卡编号和姓名。现在,我有一个从刷卡器获取输入的文本框,效果很好,但我觉得可能有更好的方法。

我想在应用程序的后台有一个键盘监听器,它可以捕获来自刷卡器的输入并在不需要文本框的情况下解析数据。我想我需要 Form1_Load 中的一个循环函数,它主动监听键盘输入,为输入准备一个缓冲区,然后当检测到回车时,继续解析缓冲的数据。解析完成后,清空缓冲区。

我的问题是我对 C# 比较陌生,我不知道在没有文本框的情况下应该使用什么来收听键盘输入。有人能指出我正确的方向吗?

如果有人感兴趣,这是我的代码:http://pastebin.com/q6AkghvN

请注意,我按照信用卡刷卡指南从 http://www.markhagan.me/Samples/CreditCardSwipeMagneticStripProcessing 并针对我的用例稍作修改。

--- 已编辑 ---

感谢 Paul 和其他所有人的帮助!

如果有人感兴趣,这是我的解决方案:

private void frmMain_KeyPress(object sender, KeyPressEventArgs e)
    {
        lblStatus.Text = "Reading Card...";
        lblStatus.ForeColor = Color.Blue;
        if (e.KeyChar != (char)Keys.Enter)
        {
            buffer += e.KeyChar;
        }
        else
        {
            lblStatus.Text = "Parsing Card...";
            if (buffer.Contains('^') && buffer.Contains(';') && buffer.Contains('='))
            {
                try
                {
                    string[] cardData = buffer.Split(';');
                    string[] caretData = cardData[0].Split('^');
                    string[] nameData = caretData[1].Split('/');
                    string[] equalData = cardData[1].Split('=');
                    tBoxHealthCardNumber.Text = equalData[0];
                    tBoxDateOfBirth.Text = FormatBirthday(equalData[1]);
                    tBoxFirstName.Text = TrimName(nameData[1]);
                    tBoxLastName.Text = TrimName(nameData[0]);
                    tBoxDateTimeScanned.Text = DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm");
                    e.Handled = true;
                }
                catch (Exception)
                {
                    throw;
                }
            }
            else
            {
                lblStatus.Text = "Error Reading Card";
            }

            buffer = "";
            lblStatus.Text = "Ready";
            lblStatus.ForeColor = Color.Green;
        }
    }

【问题讨论】:

  • 我不确定表单本身的 keyup 事件是否会检测到滑动,但您可以尝试一下
  • 我只是在看你的代码,读卡器在什么时候真正发送数据?
  • @Shane.C 据我了解,许多读卡器都充当键盘:它们发送数据就像在键盘上键入一样。我相信条形码扫描仪也倾向于以这种方式工作。
  • 啊,好吧!不知道那个。我认为保罗的答案可能是当时的路要走
  • 如果您想提出答案,应将其添加为答案,而不是对问题进行编辑。

标签: c# string-parsing magnetic-cards


【解决方案1】:

如果您向表单添加键处理程序,当焦点位于控件上时,您将看不到按键,例如一个文本框。为了使表单即使在有焦点控件时也能看到按键,您还必须启用KeyPreview 属性。

然后,您可以在表单上添加KeyDownKeyPress 和/或KeyUp 的处理程序,以接收这些事件。

正如您在KeyPreview 的文档中看到的那样,如果您将Handled 属性设置为true,您可以防止事件随后发送到焦点控件,即您可以隐藏某些关键事件不被看到通过焦点控制。

【讨论】:

  • 也许更好的方法是为 Keydown 和 Keyup 捕获 windows 事件,这样即使您的应用程序不在顶部,您也可以捕获并输出。
  • 谢谢!我想这可能就是我正在寻找的答案。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2012-08-24
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多