Przechwyć dane z klawiatury bez pola tekstowego

Mam aplikację, która odczytuje dane z kart zdrowia i analizuje je pod kątem podstawowych informacji, takich jak D.O.B., Karta zdrowia # i nazwy. W tej chwili mam pole tekstowe, które pobiera dane z czytnika kart i działa świetnie, ale wydaje mi się, że może być lepsze podejście do tego.

Chcę, aby w tle aplikacji znajdował się słuchacz klawiatury, który przechwytuje dane wejściowe z czytnika kart i analizuje dane bez potrzeby pola tekstowego. Uważam, że będę potrzebował funkcji pętli w formularzu Form1_Load, który aktywnie nasłuchuje danych wprowadzanych z klawiatury, przygotowuje bufor dla danych wejściowych, a następnie po wykryciu powrotu karetki kontynuuje i analizuje buforowane dane. Po zakończeniu analizowania wyczyść bufor.

Mój problem polega na tym, że jestem stosunkowo nowy w C # i nie wiem, co powinienem używać do słuchania wejść klawiatury bez pola tekstowego. Czy ktoś mógłby wskazać mi właściwy kierunek?

Oto mój kod na wypadek, gdyby ktoś był zainteresowany:http://pastebin.com/q6AkghvN

Tylko uwaga, podążałem za przewodnikiem po karcie kredytowejhttp://www.markhagan.me/Samples/CreditCardSwipeMagneticStripProcessing i zmodyfikowałem go nieco dla mojej skrzynki.

--- EDYCJA ---

Dziękuję Paulowi i wszystkim innym za ich pomoc!

Oto moje rozwiązanie, jeśli ktoś jest zainteresowany:

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

questionAnswers(1)

yourAnswerToTheQuestion