PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。下面主要学习了以下几点:
- 如何设置鼠标和键盘的“钩子”
- 事件信息
- 如何传递和屏蔽事件
pythoncom 任何应用程序想得到鼠标和键盘的输入事件通知,都必须有一个Windows的消息通道。最简单的方法是使用在Win32扩展的Python包pythoncom 的PumpMessages方法。
import pythoncom
pythoncom.PumpMessages()
Mouse Hooks 要接收鼠标事件,你必须创建一个HookManager对象,并提供它会为您感兴趣的事件的回调。例如,你可以选择接收只有左边的按钮按下事件,鼠标移动事件,或所有鼠标事件,仅举几例。每个事件类型可以被定向到一个且只有一个回调函数。
import pythoncom, pyHook
def OnMouseEvent(event):
# called when mouse events are received
print 'MessageName:',event.MessageName
print 'Message:',event.Message
print 'Time:',event.Time
print 'Window:',event.Window
print 'WindowName:',event.WindowName
print 'Position:',event.Position
print 'Wheel:',event.Wheel
print 'Injected:',event.Injected
print '---'
# 返回 True 以便将事件传给其它处理程序
# 注意,这儿如果返回 False ,则鼠标事件将被全部拦截
# 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了
return True
# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
hm.MouseAll = OnMouseEvent
# set the hook
hm.HookMouse()
# wait forever
pythoncom.PumpMessages()
Keyboard Hooks 键盘“钩子”的运行方式和鼠标的相似,只是返回的信息不同。
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
# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()
Event Filtering 键盘和鼠标事件的回调可以决定是否允许事件讯息传递给他们的窗口。如果一个回调函数返回True,允许消息传递给其他应用程序,然后到它的目的地已注册的回调。如果函数返回FALSE,消息被封锁。
import pythoncom, pyHook
def OnKeyboardEvent(event):
# block only the letter A, lower and uppercase
return (event.Ascii not in (ord('a'), ord('A')))
# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()