Отказ от ответственности: я не эксперт в этом,
Я просто делюсь своими наблюдениями о учебнике и документации ,
в надежде, что это будет полезно.
Атрибуты на event
не для вас, чтобы установить вручную,
но чтобы ваши обработчики событий могли читать и действовать.
Как видно из документации KeyboardEvent и MouseEvent ,
Цель переменных экземпляра Injected
- проверить, было ли событие сгенерировано программно или нет.
Я думаю, это означает, что события, которые ваши обработчики получают от мыши и клавиатуры, всегда будут иметь эту переменную False
.
И есть способ генерировать события программно,
Я представляю с целью тестирования ваших обработчиков.
И этот метод выглядит так: HookManager.KeyboardSwitch и HookManager.MouseSwitch .
Попробуйте это например. Создайте простую программу, чтобы увидеть детали некоторых реальных событий клавиатуры:
import pythoncom, pyHook
def OnKeyboardEvent(event):
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 '---'
# return True to pass the event to other handlers
return True
# create a hook manager
hm = pyHook.HookManager()
# watch for key press events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()
Нажмите пару клавиш и посмотрите на результаты. Нажмите Control-C, чтобы завершить программу.
Затем, чтобы сгенерировать некоторые события программно и посмотреть, как они выглядят,
попробуйте что-то вроде этого:
import pythoncom, pyHook
def OnKeyboardEvent(event):
# ... same code as in previous sample ...
# create a hook manager
hm = pyHook.HookManager()
# watch for key press events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# send keyboard event programmatically
msg = ... # a value like in the "Message: ..." output in the previous run
vk_code = ... # a value like in the "KeyID: ..." output in the previous run
scan_code = ... # a value like in the "ScanCode: ..." output in the previous run
ascii = ... # a value like in the "Ascii: ..." output in the previous run
flags = 0x10 # see http://pyhook.sourceforge.net/doc_1.5.0/pyhook.HookManager-pysrc.html#KeyboardEvent.IsInjected
time = ... # a value like in the "Time: ..." output in the previous run
hwnd = ... # a value like in the "Window: ..." output in the previous run
win_name = ... # a value like in the "WindowName: ..." output in the previous run
hm.KeyboardSwitch(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name)
После того, как вы установите соответствующие значения,
и запустить эту программу,
вы должны увидеть «Injected: True» в выводе.
Я думаю, что это основная идея, и аналогично для событий мыши.
К сожалению, я не могу это проверить,
потому что pyHook
- это библиотека для ОС Windows, которой у меня нет.