У меня есть два устройства, сканер штрих-кода и клавиатура, подключенные к компьютеру через USB. Моя цель — прочитать все данные со сканера штрих-кода и обработать их с помощью моей программы. Кроме того, вход Сканера должен быть заблокирован для ОС.
Я нашел хорошую статью на эту тему, которая называется:
Комбинирование необработанного ввода и клавиатуры Hook для выборочного блокирования ввода с нескольких клавиатур
При таком подходе я могу получить вход (и с какого устройства этот вход) для моей программы и заблокировать его для ОС, как я хочу. Но этот подход довольно сложный, потому что он работает только с комбинацией inputEvents и Hooks. Крюки там для блокировки данных для ОС.
Проблема в том, что нет способа узнать, с какого устройства приходит Hook.
Мой вопрос: кто-нибудь знает другой способ заблокировать ввод со специальной клавиатуры, которая не работает с этой комбинацией inputEvents и Hooks? Или, может быть, есть возможность узнать, с какого устройства приходит Hook?
Я использую timer.tick
создать массив для numpadkeys и пройти через это
GetAsyncKeyState(VK_LBUTTON)
иначе
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646290(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646298(v=vs.85).aspx
Как проверить, введен ли пользователь с сканера штрих-кода или клавиатуры?
Это относительно легко сделать с помощью 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 в ваш проект вы можете прослушивать события:
// Создать новый объект InputDevice и зарегистрировать обработчик события InputDevice KeyPressed.
input_dev = new InputDevice( Handle );
input_dev.KeyPressed += new InputDevice.DeviceEventHandler( m_KeyPressed );
The event handler m_KeyPressed lets you to distinguish your devices through 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.
}
Надеюсь, что помог.
если ты читаешь мои первые ссылки.
typedef struct tagINPUT_MESSAGE_SOURCE {
INPUT_MESSAGE_DEVICE_TYPE deviceType;
INPUT_MESSAGE_ORIGIN_ID originId;
} INPUT_MESSAGE_SOURCE;
https://msdn.microsoft.com/en-us/library/windows/desktop/hh448799(v=vs.85).aspx
POS для .NET | Различают сканер штрих-кода и ввод с клавиатуры
и данные со сканера могут быть разделены с помощью vbcrlf
http://msgroups.net/development.device.drivers/how-to-uniquely-identify-a-usb-hid/14444