Обработка и блокировка ввода со специальной клавиатуры

У меня есть два устройства, сканер штрих-кода и клавиатура, подключенные к компьютеру через USB. Моя цель — прочитать все данные со сканера штрих-кода и обработать их с помощью моей программы. Кроме того, вход Сканера должен быть заблокирован для ОС.

Я нашел хорошую статью на эту тему, которая называется:
Комбинирование необработанного ввода и клавиатуры Hook для выборочного блокирования ввода с нескольких клавиатур

При таком подходе я могу получить вход (и с какого устройства этот вход) для моей программы и заблокировать его для ОС, как я хочу. Но этот подход довольно сложный, потому что он работает только с комбинацией inputEvents и Hooks. Крюки там для блокировки данных для ОС.
Проблема в том, что нет способа узнать, с какого устройства приходит Hook.

Мой вопрос: кто-нибудь знает другой способ заблокировать ввод со специальной клавиатуры, которая не работает с этой комбинацией inputEvents и Hooks? Или, может быть, есть возможность узнать, с какого устройства приходит Hook?

1

Решение

Я использую 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.
}

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

-2

Другие решения

если ты читаешь мои первые ссылки.

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

-3

По вопросам рекламы [email protected]