Разрешить только сканер штрих-кода и исключить ввод с клавиатуры - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

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

Также попробовал приведенный ниже код, но даже это не работает, как ожидалось для меня

private void rtBoxInput_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
}

Пожалуйста, предложите какой-нибудь хороший способ реализовать это?

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Что вы можете сделать, это обработать ваш штрих-код непосредственно в вашей форме с помощью события KeyPress и отключить TextBox:

     private void Form1_KeyPress(object sender, KeyPressEventArgs e)
     {
        barcode = string.Empty;

        try
        {
            barcode += e.KeyChar;

            if (lastTime > new DateTime())
            {
                if (DateTime.Now.Subtract(lastTime).Milliseconds > 30)
                {
                    f1 = false;
                }
                else
                {
                    f1 = true;
                }
            }

            lastTime = DateTime.Now;

            /*

            Test your Barcode, and if it matches your criteria then change your TextBox text

            TextBox1.Text = barcode;

            */

        }
        catch (Exception ex)
        {
            MessageBox.Show("Something went wrong");
        }
     }

Не забудьте установить Form1.KeyPreview = true, и это должно сделатьтрюк!

0 голосов
/ 22 мая 2018

Основная идея заключается в проверке:

, если события KeyUp и KeyDown запускаются с одинаковых клавиш и в течение заданного времени (скажем, 17 миллисекунд), поскольку это можно сделать только с помощью сканера штрих-кода.

Никто не может вызвать события KeyDown и KeyUp одного и того же ключа в течение 17 миллисекунд.Например, для нажатия и отпускания одной и той же клавиши кому-либо потребуется больше указанного времени, однако он может нажать клавишу удара в клавиатуре, которая объединит несколько клавиш вместе и вызовет их события KeyDown и KeyUp, но все клавиши не будут иметь событий KeyUp и KeyDown.выстрелил синхронно.Таким образом, таким образом вы можете определить, был ли ввод с помощью обычной клавиатуры или сканера штрих-кода.

Пожалуйста, посмотрите ниже:

public partial class BarcodeReader : Form
    {

        char cforKeyDown = '\0';
        int _lastKeystroke = DateTime.Now.Millisecond;
        List<char> _barcode = new List<char>(1);
        bool UseKeyboard = false;
        public BarcodeReader()
        {
            InitializeComponent();
        }
        private void BarcodeReader_Load(object sender, EventArgs e)
        {
            this.KeyDown += new KeyEventHandler(BarcodeReader_KeyDown);
            this.KeyUp += new KeyEventHandler(BarcodeReader_KeyUp);
        }
        private void BarcodeReader_KeyUp(object sender, KeyEventArgs e)
        {
            // if keyboard input is allowed to read
            if (UseKeyboard && e.KeyData != Keys.Enter)
            {
                MessageBox.Show(e.KeyData.ToString());
            }

            /* check if keydown and keyup is not different
             * and keydown event is not fired again before the keyup event fired for the same key
             * and keydown is not null
             * Barcode never fired keydown event more than 1 time before the same key fired keyup event
             * Barcode generally finishes all events (like keydown > keypress > keyup) of single key at a time, if two different keys are pressed then it is with keyboard
             */
            if (cforKeyDown != (char)e.KeyCode || cforKeyDown == '\0')
            {
                cforKeyDown = '\0';
                _barcode.Clear();
                return;
            }

            // getting the time difference between 2 keys
            int elapsed = (DateTime.Now.Millisecond - _lastKeystroke);

            /*
             * Barcode scanner usually takes less than 17 milliseconds as per my Barcode reader to read , increase this if neccessary of your barcode scanner is slower
             * also assuming human can not type faster than 17 milliseconds
             */
            if (elapsed > 17)
                _barcode.Clear();

            // Do not push in array if Enter/Return is pressed, since it is not any Character that need to be read
            if (e.KeyCode != Keys.Return)
            {
                _barcode.Add((char)e.KeyData);
            }

            // Barcode scanner hits Enter/Return after reading barcode
            if (e.KeyCode == Keys.Return && _barcode.Count > 0)
            {
                string BarCodeData = new String(_barcode.ToArray());
                if (!UseKeyboard)
                    MessageBox.Show(String.Format("{0}", BarCodeData));
                _barcode.Clear();
            }

            // update the last key press strock time
            _lastKeystroke = DateTime.Now.Millisecond;
        }

        private void BarcodeReader_KeyDown(object sender, KeyEventArgs e)
        {
            //Debug.WriteLine("BarcodeReader_KeyDown : " + (char)e.KeyCode);
            cforKeyDown = (char)e.KeyCode;
        }
    }

Проверьте здесь .. GitHub Link

0 голосов
/ 22 мая 2018

Если ваш штрих-код имитирует клавиатуру - вы не сможете найти, какой из них вводит текст в вашем текстовом поле.Может ли ваш сканер штрих-кода добавить префикс к отсканированному коду?Если да - я думаю, что это лучший вариант в сочетании с таймером 50 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...