У меня есть сканер штрих-кода (который действует как клавиатура), и, конечно, у меня есть клавиатура, подключенная к компьютеру. Программное обеспечение принимает вход как от сканера, так и от клавиатуры. Мне нужно принять только вход сканера. Код написан на С#. Есть ли способ "отключить" ввод с клавиатуры и принимать входной сигнал от сканера?
Примечание: Клавиатура является частью ноутбука... поэтому его нельзя отключить. Кроме того, я попытался ввести следующий код protected override Boolean ProcessDialogKey (System.Windows.Forms.Keys keyData) { return true; } Но затем, игнорируя нажатия клавиш с клавиатуры, вход сканера штрих-кода также игнорируется.
Я не могу заставить сканер отправлять сигнальные символы, поскольку сканер используется другими приложениями, а добавление потока сигнальных символов означает изменение другого кода.
Кроме того, я не могу использовать метод синхронизации, определяющий, поступал ли вход от сканера штрих-кода (если его группа символов сопровождалась паузой), поскольку сканированные штрих-коды потенциально могут быть одиночными символьными штрих-кодами.
Да, я читаю данные из потока.
Я пытаюсь следовать вместе со статьей: Отличительные сканеры штрих-кода от клавиатуры в WinForms. Однако у меня есть следующие вопросы:
- Я получаю сообщение об ошибке. NativeMethods недоступен из-за уровня защиты. Кажется, мне нужно импортировать dll; это верно? Если да, то как мне это сделать?
- Какое защищенное переопределение void WndProc (ref Message m) должно использоваться, есть две реализации в этой статье?
- Возникает ошибка, связанная с ошибкой [SecurityPermission (SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] CS0246: Не удалось найти имя типа или пространства имен "SecurityPermission" (вам не хватает директивы using или ссылки на сборку?). Как устранить эту ошибку?
- Также есть ошибка в строке, содержащей: if ((from hardwareId в hardwareIds, где deviceName.Contains(hardwareId) select hardwareId).Count() > 0) Ошибка - это ошибка CS1026:).
- Должен ли я размещать весь код в статье в одном файле .cs с именем BarcodeScannerListener.cs?
Последующие вопросы о исходном коде С#, опубликованном Николасом Пиасекским, http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/:
- Мне не удалось открыть решение в VS 2005, поэтому я загрузил Visual С# 2008 Express Edition и код работал. Однако после подключения сканера штрих-кодов и сканирования штрих-кода программа не распознала сканирование. Я поставил точку останова в методе OnBarcodeScanned, но он никогда не попадал. Я изменил App.config с идентификатором моего сканера штрих-кода, полученного с помощью диспетчера устройств. Кажется, что есть 2 имени устройства с HID # Vid_0536 & Pid_01c1 (который получен из диспетчера устройств при подключении сканера). Я не знаю, вызывает ли это сканирование, чтобы он не работал. Когда выполняется итерация над именами устройств, вот список найденных устройств (с помощью отладчика):
"\??\HID # Vid_0536 & Pid_01c1 & MI_01 # 9 & 25ca5370 & 0 & 0000 # {4d1e55b2-F16F-11cf-88cb-001111000030}"
"\??\HID # Vid_0536 & Pid_01c1 & MI_00 # 9 & 38e10b9 & 0 & 0000 # {884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID # Vid_413c & Pid_2101 & MI_00 # 8 & 1966e83d & 0 & 0000 # {884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID # Vid_413c & Pid_3012 # 7 & 960fae0 & 0 & 0000 # {378de44c-56ef-11d1-bc8c-00a0c91405dd}"
"\??\Root # RDP_KBD # 0000 # {884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\ACPI # PNP0303 # 4 & 2f94427b & 0 # {884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\Root # RDP_MOU # 0000 # {378de44c-56ef-11d1-bc8c-00a0c91405dd}"
"\??\ACPI # PNP0F13 # 4 & 2f94427b & 0 # {378de44c-56ef-11d1-bc8c-00a0c91405dd}"
Таким образом, для HID # Vid_0536 & Pid_01c1 имеется 2 записи; может ли это заставить сканирование работать?
ОК, похоже, что мне нужно было выяснить способ не зависеть от символа ASCII 0x04, отправляемого сканером... поскольку мой сканер не отправляет этот символ. После этого происходит отсканированное событие штрих-кода и отображается всплывающее окно со штрих-кодом. Так что спасибо Николаю за вашу помощь.