Как узнать, поступает ли клавиатурный сканер со сканера штрих-кода?

На одном компьютере у меня есть как обычная клавиатура, так и сканер штрих-кода, который эмулирует клавиатуру. Когда мое приложение получает ввод на клавиатуре, как я могу определить, поступает ли этот вход от сканера штрих-кода или реальной клавиатуры?

Ответ 1

Вы получите информацию от обоих. Не одновременно, конечно. Все они будут помещены в очередь, но Windows будет обрабатывать ключевые события с обеих клавиш.

Не будь беспомощным. Как предлагает Дэвид Хеффернан, вы можете легко понять это сами, подключив обе клавиатуры к компьютеру, открыв блокнот и набрав случайные символы, чтобы увидеть, какой из них генерирует вход.

Вы отвечаете, что хотите "проверить это с помощью кода на С#", но я понятия не имею, что это значит. Как создать консольное приложение, которое считывает ввод с клавиатуры и отображает его на экране?

using System;

class AdvancedKeyboardTester
{
   static void Main(string[] args)
   {
      for (; ;)
      {
         Console.ReadKey();
      }
   }
}

Нажмите Ctrl + C, когда вы устанете от удовольствия и хотите выйти из программы.


Изменить: Похоже, вы ищете функцию RegisterRawInputDevices, которая позволяет вам включить сырой вход для всех ваших клавиатур, а затем перечислить результаты, чтобы определить, какое устройство отправило сообщение.

К счастью, похоже, что кто-то уже написал библиотеку-оболочку С# для этого, доступную для загрузки в Code Project: Использование Raw Input из С# для обработки нескольких клавишные


Изменить 2: (кажется, что информация просто держится от комментариев)

Если вы используете сканер штрих-кода, это становится намного проще. Поскольку они специально разработаны для этой цели, они почти все программируются. Это означает, что вы можете сообщить им префикс (и/или суффикс) их ввода с некоторыми сигнальными символами, которые указывают, что вход поступает со сканера штрих-кодов, а не на стандартную клавиатуру. (Для получения дополнительной информации обратитесь к руководству пользователя сканера штрих-кода). Затем все, что вам нужно сделать, это отфильтровать ввод с клавиатуры в зависимости от присутствия или отсутствия этих символов часового. Вы также можете проверить, насколько быстро были введены символы между префиксом и суффиксом.

Ответ 2

Взгляните на Microsoft MultiPoint SDK

(отредактируйте: этот ответ больше не применим теперь, когда вопрос выяснен. Я оставляю его здесь, чтобы другие могли его обнаружить)

Ответ 3

Это зависит от ОС, однако вы обнаружите, что в большинстве современных операционных систем вы получите одновременный ввод обоих. Лучшим методом было бы попробовать его на своей платформе.

Избегайте одновременного ввода обоих людей;)

Ответ 4

Попросите прослушиватель событий проверить временную задержку между нажатиями клавиш. Сканер штрих-кода будет посылать нажатия клавиш очень быстро, а человеческий ввод с использованием клавиатуры будет сравнительно медленным. Я знаю, что это сработает, потому что я сделал такую ​​вещь, используя Javascript в веб-приложении.

Я не знаю программирования на С#, поэтому я только что дал вам логику. Счастливый день!

Ответ 5

Вот что-то смоделированное от ответа @asif. Он предназначен для использования в приложении WPF, находится в С# и был протестирован. Я пошел с секундомером, поскольку он более точным, чем datetime, вы найдете его в пространстве имен System.Diagnostics.

Я хотел, чтобы мой захватил текст, когда приложение (а не конкретное текстовое поле) было в фокусе, так что это тоже немного отличается. Вы увидите, что для того, чтобы справиться с этим правильно, поскольку я не знаю, что вставил фактический символ, только перечисление Key. Поскольку в первую очередь заботятся о числах 1-10, и эти перечисления D1, D2 и т.д., Я отключаю D-часть, когда это необходимо.

Stopwatch _inputStopwatch = new Stopwatch();
string _input = "";

private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        _inputStopwatch.Reset();
        HandleBarcode(_input);
        _input = "";
    }
    else
    {
        if (!_inputStopwatch.IsRunning)
            _inputStopwatch.Start();
        else if (_inputStopwatch.ElapsedMilliseconds > 50)
        {
            _inputStopwatch.Restart();
            _input = "";
        }

        Console.WriteLine("DEBUG: " + e.Key + " - " + _inputStopwatch.ElapsedMilliseconds + "ms");

        var keyString = e.Key.ToString();
        if (keyString.Length == 2 && keyString.StartsWith("D"))
            keyString = keyString[1].ToString();

        //if (_inputStopwatch.ElapsedMilliseconds < 50)
            _input += keyString;
        //else
        //    _input = "";

        _inputStopwatch.Restart();
    }
}

private void HandleBarcode(string barcodeInput)
{
    //do stuff with the barcode input
}

Ответ 6

Try:

Dim PreviousKeyPressTime As DateTime = Nothing

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown

    If e.KeyCode = Keys.Enter Then
        PreviousKeyPressTime = Nothing
        TextBox1.Text = String.Empty
    Else
        If PreviousKeyPressTime = Nothing Then
            PreviousKeyPressTime = DateTime.Now
        End If
        Dim startTime As DateTime = Now
        Dim runLength As Global.System.TimeSpan = startTime.Subtract(CType(Me.PreviousKeyPressTime, DateTime))
        Dim millisecs As Integer = runLength.Milliseconds
        Dim secs As Integer = runLength.Seconds
        Dim TotalMiliSecs As Integer = ((secs * 1000) + millisecs)

        lblDiff.Text = TotalMiliSecs

        If TotalMiliSecs <= 50 Then
            lblMsg.Text = String.Empty
        Else
            lblMsg.Text = "keyboard Input not Allow"
        End If
        PreviousKeyPressTime = DateTime.Now
    End If
End Sub

Источник: http://itlearnerinsect.blogspot.com/

Ответ 7

Почти все считыватели штрих-кодов могут быть настроены с префиксом и суффиксом на все, что он читает. Попробуйте и настройте свои, например, префикс "*" и суффикс, а затем в коде С#, чтобы фокус был невидимым текстовым полем всякий раз, когда он поступает из входного потока и в событии lostfocus этого текстового поля поместите весь код для обработки записи. Имейте в виду, что символ, который вы выбрали префиксом, никогда не вводится на клавиатуре. Кроме того, установите для свойства tabstop текстового поля значение false, просто чтобы пользователь не смог добраться до объекта при навигации по экрану. Удачи!