Evgeny
Evgeny

Reputation: 313

Pyhook event.Injected?

Really more of a question here. Based on pyHook's tutorial, the .HookManager().OnMouseEvent event variable in the function has a .Injected attribute. I couldn't find any information about it, does anyone know what it is? I tried doing

event.Injected = '<char to inject>'

but it didn't work.

Upvotes: 1

Views: 566

Answers (1)

janos
janos

Reputation: 124646

Disclaimer: I'm not expert of this stuff, I'm just sharing my observations about the tutorial and the documentation, in the hope that it will be helpful.

The attributes on event are not for you to set manually, but for your event handlers to read and act upon.

As you can see in the documentation of KeyboardEvent and MouseEvent, the purpose of the Injected instance variables is to check if the event was generated programmatically or not. I think, this means events that your handlers receive from mouse and keyboard activity, will always have this variable False. And there is a way to generate events programmatically, I imagine for the purpose of testing your handlers. And the method appear to be HookManager.KeyboardSwitch and HookManager.MouseSwitch.

Try this for example. Create a simple program to see the details of some real keyboard events:

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()

Press a couple of keys and observe the outputs. Press Control-C to terminate the program.

Then, to generate some events programmatically and see what they look like, try something like this:

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)

After you set appropriate values, and run this program, you should see "Injected: True" in the output.

I think this is the basic idea, and similarly for mouse events. Unfortunately I'm not able to test this, because it seems pyHook is a library for Windows OS, which I don't have.

Upvotes: 2

Related Questions