Как узнать, поступает ли клавиатурный ввод со сканера штрих-кода? - PullRequest
14 голосов
/ 11 апреля 2011

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

Ответы [ 7 ]

7 голосов
/ 11 апреля 2011

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

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

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

using System;

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

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


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

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


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

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

4 голосов
/ 11 апреля 2011

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

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

1 голос
/ 19 апреля 2016

Вот что-то по образцу ответа @ asif. Он предназначен для использования в приложении WPF, в C # и был протестирован. Я пошел с секундомером, так как он точнее даты и времени, вы найдете его в пространстве имен 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
}
1 голос
/ 06 августа 2013

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

1 голос
/ 08 сентября 2011

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

Я не знаю программирования на C #, поэтому я только что дал вам логику. С Днем Рождения!

1 голос
/ 11 апреля 2011

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

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

0 голосов
/ 24 января 2012

Попробуйте:

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/

...