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

Я сейчас создаю pos-приложение для столовой компании, в которой кассир сканирует идентификатор сотрудника и показывает его информацию для своей транзакции.

Моя проблема в том, что кассир также может использовать свою клавиатуру для ввода (Employeeid), котораяочень рискованно.

if employee(true)
   show employee information
   then add orders
else
   Exception

Currently i just hide textbox to the UI..
click New Button then cusror focus on it. 
then cashier scans employeeid.  <---------------in this part(The cashier can also type via keyboard) and continue transaction.

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

Спасибо в отношении

Ответы [ 3 ]

13 голосов
/ 23 февраля 2011

Вы можете отслеживать время, необходимое для ввода кода.Читатель вводит код намного быстрее, чем человек, набирающий его.

11 голосов
/ 23 февраля 2011

Если у вас есть возможность изменить конфигурацию сканера, вы можете добавить префикс / суффикс к отсканированным данным.Затем в коде вы можете обнаружить эти добавленные символы.

Если вы не можете, то единственный способ Ахмеда - измерение времени ввода данных.

10 голосов
/ 28 февраля 2011

Это относительно легко сделать с помощью RAW Input API.

Взгляните на " Отличительные сканеры штрих-кода от клавиатуры в WinForms "

У меня есть программа, которая читает 3 разных USB-сканера и перенаправляет ввод на 3 разных «канала» для обработки. Код довольно обширный, поэтому я не буду размещать его здесь. Если хотите, я могу вставить некоторые фрагменты или отправить вам проект по электронной почте.

В качестве подсказки можно привести:

#region Raw Input API

[DllImport( "User32.dll" )]
extern static uint GetRawInputDeviceList( IntPtr pRawInputDeviceList, ref uint uiNumDevices, uint cbSize );

[DllImport( "User32.dll" )]
extern static uint GetRawInputDeviceInfo( IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize );

[DllImport( "User32.dll" )]
extern static bool RegisterRawInputDevices( RAWINPUTDEVICE[ ] pRawInputDevice, uint uiNumDevices, uint cbSize );

[DllImport( "User32.dll" )]
extern static uint GetRawInputData( IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader );

#endregion

После добавления InputDevice в свой проект вы можете прослушивать события:

// Create a new InputDevice object and register InputDevice KeyPressed event handler.
input_dev = new InputDevice( Handle );
input_dev.KeyPressed += new InputDevice.DeviceEventHandler( m_KeyPressed );

Обработчик событий m_KeyPressed позволяет вам различать ваши устройства по e.Keyboard.SubClass

private void m_KeyPressed( object sender, InputDevice.KeyControlEventArgs e )
{
    // e.Keyboard.SubClass tells you where from the event came.
    // e.Keyboard.key gives you the input data.
}

Надеюсь, что помог.

...