2015-10-30 2 views
1

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

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

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

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

+0

Можно приложить дополнительную информацию к сообщению окна (см [SetMessageExtraInfo] (HTTPS://msdn.microsoft.com/en-us/library/windows/desktop/ms644954.aspx)). Вы проверили документацию для сканера штрих-кода, чтобы узнать, может ли она предоставить дополнительную информацию? – IInspectable

ответ

-2

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

How to Check if User input is from Barcode Scanner or Keyboard?

Это относительно легко сделано с 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. 
    } 

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

+0

Спасибо за вашу помощь, но я боюсь, что ваш ответ немного короткий для моего понимания. Что именно вы делаете? – Andre

+0

Я делаю программу базы данных штрих-кода для gs1 a sscc code, но in.net –

+0

'GetAsyncKeyState' не может различать разные устройства ввода. И это ненадежно, когда используется в таймере. Поскольку он основан на моментальных снимках, вы можете пропустить ввод с клавиатуры, который происходит между последовательными точками выборки. Устройство, отправляющее ввод с клавиатуры, обычно делает это намного быстрее, чем пользователь. – IInspectable

-3

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

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 for .NET | Differentiate between (barcode) scanner and keyboard input и данные сканера соединен можно разделить с vbcrlf

http://msgroups.net/development.device.drivers/how-to-uniquely-identify-a-usb-hid/14444

+0

Это не может отличить два разных USB-устройства, которые регистрируются как клавиатура с системой. Структура будет содержать 'IMDT_KEYBOARD' и' IMO_HARDWARE' для обоих устройств. И, пожалуйста, не начинайте новый ответ, когда хотите что-то добавить. Используйте ссылку [edit] (http://stackoverflow.com/posts/33430967/edit) в своем предыдущем ответе и обновите это. – IInspectable

+0

https://bytes.com/topic/c-sharp/answers/262261-identifying-input-keyboard-devices –

+0

[Как написать хороший ответ?] (Http://stackoverflow.com/help/how- отвечать). Это обязательное чтение. Я указывал, время от времени, что вы игнорируете заданный вопрос. Ни одно из предложенных вами решений серьезно не пытается решить этот вопрос. – IInspectable

Смежные вопросы