Есть ли сканер штрих-кода (аппаратный) с .net api, который я могу использовать для интеграции в свое приложение? - PullRequest
0 голосов
/ 03 марта 2010

Я понимаю, что сканер штрих-кода похож на клавиатуру и действует как таковой. Что мне нужно, это сканер, который имеет какой-то API (предпочтительно .net / c #), который я могу подключить к своему приложению. Есть ли конкретное аппаратное обеспечение сканера vendor , которое разработчики использовали или используют в настоящее время, которое имеет .net api? или я могу использовать любой произвольный сканер и построить API вокруг него или использовать один из них с открытым исходным кодом?

Итак, 1 вещь, которую я хотел бы сделать, это иметь возможность получить значение от usb-сканера, не помещая курсор в конкретное текстовое поле.

Спасибо

Ответы [ 3 ]

4 голосов
/ 03 марта 2010

Ну, это зависит. Если у вас есть USB-сканер штрих-кода, он работает точно так же, как клавиатура, считывая отсканированный текст прямо в фокусированный элемент управления. Если у вас есть серийный сканер штрих-кода, вам нужно будет использовать класс SerialPort в .NET.

Если вам необходимо проанализировать данные перед заполнением текстового поля и т. Д., Лучше всего использовать последовательный сканер.

Вот пример кода для использования:

public partial class Form1 : Form
{
     SerialPort _serialPort;

     // delegate is used to write to a UI control from a non-UI thread
     private delegate void SetTextDeleg(string text);

     private void Form1_Load(object sender, EventArgs e)
     {
           // all of the options for a serial device
           // can be sent through the constructor of the SerialPort class
           // PortName = "COM1", Baud Rate = 19200, Parity = None, 
           // Data Bits = 8, Stop Bits = One, Handshake = None
           _serialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
           _serialPort.Handshake = Handshake.None;
           _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
           _serialPort.ReadTimeout = 500;
           _serialPort.WriteTimeout = 500;
           _serialPort.Open();
     }

     private void btnStart_Click(object sender, EventArgs e)
     {
           // Makes sure serial port is open before trying to write
           try
           {
                if(!_serialPort.IsOpen)
                     _serialPort.Open();

                _serialPort.Write("SI\r\n");
           }
           catch (Exception ex)
           {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
           }
     }

     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
          Thread.Sleep(500);
          string data = _serialPort.ReadLine();
          this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
     }

     private void si_DataReceived(string data)
     {
           textBox1.Text = data.Trim();
     }
}
1 голос
/ 03 марта 2010

Чтобы остаться на сканере, который работает как клавиатура, вы также можете попытаться обнаружить все нажатия клавиш во всем приложении. Чтобы получить событие KeyPress в вашем приложении, вы должны установить Form.KeyPreview на true и зарегистрироваться на вышеупомянутое событие вашей формы.

Теперь вы получите каждый ключ перед его отправкой текущему активному элементу управления, и вы можете делать с ним все, что захотите. Чтобы предотвратить его отправку текущему активному элементу управления после выполнения работы, установите для e.Handled значение true.

.

Но у этого решения определенно есть два недостатка:

  1. Работает только в том случае, если ваше приложение является активным окном. Поэтому, если пользователь переключит фокус на другое приложение, вы больше не будете нажимать клавиши.
  2. Может быть, может быть очень сложно решить, была ли входящая клавиша отправлена ​​со сканера или пользователь просто нажал клавишу на своей клавиатуре. Одной из возможностей может быть кэширование входящих ключей и измерение времени разницы между ними, потому что человек обычно не входит так быстро, как сканер (если вы не секретарь с 300 или более нажатиями клавиш в минуту ;-) ).
0 голосов
/ 03 марта 2010

Я реализовал аналогичную систему, используя сканер штрих-кода. Я почти уверен (не на 100%, как это было давно), что текст появился как одна большая строка и вызвал только одно событие нажатия клавиши. Таким образом, вы можете сравнить входную строку с типичной строкой штрих-кода, например, KeyPressEvent , и если он совпадает, ищите элемент. Или даже просто проверьте длину символов в строке (как будто для ввода с клавиатуры она должна составлять всего 1 символ за раз).

Вы проверяли это на базовой форме?

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