Работаю со сканером баркодов на питоне. После долгих поисков и проб смог реализовать считывание кодов в линуксе. Но нужно реализовать в винде. К сожалению, в винде нет events и hidraw, поэтому легко перенести не получилось.
На примете есть несколько вариантов: ловля кодов напрямую (устройство в hid-режиме), работа с устройством через какой-то драйвер, работа с usb напрямую (самый нежелательный вариант). Начал с первого.
Для винды есть некоторые полезные библиотеки типа pywin32, pyHook, hid. С помощью них сделал несколько вариантов считывания разной степени качества.
Проблема в том что я плохо понимаю как работает все под капотом, особенно это касается винды. Не получается придумать какое-то хорошее решение. Даже гуглинг не помогает: тему мало кто знает и примеры часто чуть сложнее hello world + для винды нет библиотек. В связи с чем возникло ощущение что такие вещи делаются на .Net с помощью стандартных либ и без костылей. Или как-то еще. Даже появляются мысли засунуть линукс в виртуалку и прокинуть устройство туда, а винде как-то ловить события уже с моего скрипта...
Но пока что я все же хочу попробовать выполнить это на питоне. В связи с чем прошу что-то посоветовать, может быть какой-то пример решения. Так же было бы интересно узнать как фильтровать ввод с "устройств ввода": где пришло с клавиатуры, а где со сканера.
Вот один из вариантов ловли событий hid для винды:
spoilerimport pythoncom, pyHook, sys, logging
def OnKeyboardEvent(event):
# Source: http://code.activestate.com/recipes/553270-using-pyhook-to-block-windows-keys/
print ('MessageName:',event.MessageName)
print ('Message:',event.Message)
print ('Time:',event.Time)
print ('Window:',event.Window)
print ('WindowName:',event.WindowName)
print ('Ascii:', event.Ascii, chr(event.Ascii))
print ('Key:', event.Key)
print ('KeyID:', event.KeyID)
print ('ScanCode:', event.ScanCode)
print ('Extended:', event.Extended)
print ('Injected:', event.Injected)
print ('Alt', event.Alt)
print ('Transition', event.Transition)
print ('---')
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()