无需文本框即可捕获键盘输入

时间:2013-01-17 14:10:33

标签: c# string-parsing magnetic-cards

我有一个应用程序从健康卡读取数据并解析它们以获取基本信息,如D.O.B.,Health Card#和名称。现在,我有一个文本框,从卡片刷卡中获取输入并且效果很好,但我觉得可能有更好的方法。

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

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

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

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

--- EDITED ---

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

1 个答案:

答案 0 :(得分:3)

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

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

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