【pyHook】

  pyHook是一个用来进行键盘、鼠标等层面事件监控的库。这个库的正常工作需要pythoncom等操作系统的API的支持。首先来说说如何安装。

  直接pip install pyHook是找不到相关包的,不知道是不是因为这个库可以被用于一些比较邪恶的目的。。于是就要去网上下,可以下源码编译安装,不过在https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook这里可以直接下载到.whl文件,这个文件可以作为pip install 的参数来进行安装。也就是说pip install xxx.whl即可。

  安装完成后import pyHook无误,顺便可以检查一下import win32com和pythoncom两个库,确保支持的库都有安装。

■  键盘事件监听基本使用

  监测键盘事件主要用到了pyHook的KeyBoardEvent类,这个类的源码是这样的:

  1. class KeyboardEvent(HookEvent):
  2. '''
  3. Holds information about a mouse event.
  4. @ivar KeyID: Virtual key code
  5. @type KeyID: integer
  6. @ivar ScanCode: Scan code
  7. @type ScanCode: integer
  8. @ivar Ascii: ASCII value, if one exists
  9. @type Ascii: string
  10. '''
  11. def __init__(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, window_name):
  12. '''Initializes an instances of the class.'''
  13. HookEvent.__init__(self, msg, time, hwnd, window_name)
  14. self.KeyID = vk_code
  15. self.ScanCode = scan_code
  16. self.Ascii = ascii
  17. self.flags = flags
  18. def GetKey(self):
  19. '''
  20. @return: Name of the virtual keycode
  21. @rtype: string
  22. '''
  23. return HookConstants.IDToName(self.KeyID)
  24. def IsExtended(self):
  25. '''
  26. @return: Is this an extended key?
  27. @rtype: boolean
  28. '''
  29. return self.flags & 0x01
  30. def IsInjected(self):
  31. '''
  32. @return: Was this event generated programmatically?
  33. @rtype: boolean
  34. '''
  35. return self.flags & 0x10
  36. def IsAlt(self):
  37. '''
  38. @return: Was the alt key depressed?
  39. @rtype: boolean
  40. '''
  41. return self.flags & 0x20
  42. def IsTransition(self):
  43. '''
  44. @return: Is this a transition from up to down or vice versa?
  45. @rtype: boolean
  46. '''
  47. return self.flags & 0x80
  48. Key = property(fget=GetKey)
  49. Extended = property(fget=IsExtended)
  50. Injected = property(fget=IsInjected)
  51. Alt = property(fget=IsAlt)
  52. Transition = property(fget=IsTransition)

  最下面的property函数可以设置一个类似java成员变量的类属性(之前在Python类结构中就提到过@property这个设置类属性的方法)。fget参数设置一个方法,这个方法的返回将被设置为这个类属性的值。那几个方法返回的内容在注释里面都说明了,而&这个位运算符,emmm…不说了吧

  接下来是一个简单的实例,当我们按下一个按键的时候stdout中打印出这个动作的信息,松开时再打印出松开的信息。注意,pyHook调用的是系统层面的钩子而不是这个进程自己范围内的东西。这也就是说,在系统中的任何地方(不论是python shell内外),按键时都会触发事件。

  1. import pyHook
  2. import pythoncom
  3.  
  4. class KeyBoardManager():
  5. keyIsPressed = False
  6. def onKeyDown(self,event):
  7. if self.keyIsPressed:
  8. return True
  9. print str(event.Key) + ' is pressed'
  10. self.keyIsPressed = True
  11. return True
  12.  
  13. def onKeyUp(self,event):
  14. self.keyIsPressed = False
  15. print str(event.Key) + ' is released'
  16. return True
  17.  
  18. if __name__ == '__main__':
  19. mykbmanager = KeyBoardManager()
  20. hookmanager = pyHook.HookManager()
  21. hookmanager.KeyDown = mykbmanager.onKeyDown
  22. hookmanager.KeyUp = mykbmanager.onKeyUp
  23. hookmanager.HookKeyboard()
  24. pythoncom.PumpMessages()

  可以看到,HookManager是我们用的pyHook库中的一个类。这个类其实就是用来管理hook各种各样的事件的。通过它我们可以往不同的事件上绑定不同的函数(方法)从而实现监听的功能。另外定义了一个类作为充实HookManager的内容。至于为什么不用几个直接的函数而是用了一个类和类中的方法,这个之后再说。

  然后再来看KeyBoardManager类,实现了两个方法,分别都有一个event参数,这个参数就是指代了一个KeyBoardEvent的实例。这里主要用到了event.Key这个属性。这个属性就是指代了哪个键盘上的按键被按下,这里虽然用了str方法转化类型,但是似乎直接用event.Key也是一个字符串类型。这里特别需要注意的一点:需要搞清楚事件触发条件的定义。比如KeyDown事件并不是“按下键”,而是“按着键”,当我们规定一个方法,方法里print event.Key,然后我们关联了这个方法和hookmanager.KeyDown,这样只要我们按着某个键不松开,stdout就会源源不断地打印出这个键名。另外,事件响应函数必须在合适的地方进行返回,返回内容最好是True或者False,当返回True时,意思是除了我们规定的事件之外,原来按键本身就会发生的事件也会发生。比如在上面这段监听程序下,我们打开记事本准备输入,长按空格键,当onKeyDown方法两处都返回True时(如代码中一样),空格还是会被源源不断输入记事本。但是如果两处都返回False,则长按空格键只是打印出Space is pressed,而不会在记事本中输入任何空格。这么一来就好比是键盘被禁言了,无论在系统的什么地方输入什么都不会奏效。如果在下面的return处是True,而在上面设置return False可能是比较理想的情况,此时按键时的输入会被写到记事本,且只写一次,而按下和松开也有相应的信息输出。

  在这个实例中,我们的期望是按下按键之后打印出信息,然后松开的时候再打印一次,中途按着的时候不用打印。这时候就需要在方法的定义上下一些功夫,这也就是为什么我们不用简单的函数而是用类方法来定义事件响应函数。简单来说就是我们在类中维护了一个状态flag,当键被按下时首先置状态为True,之后在按着的过程中此状态一直保持True,所以一直不会在屏幕上输出,直到松开,状态被置回并且打印松开的信息(松开的事件是“送开键”而不是“送着键”,要不然什么都不干就有事件了。。)

  KeyBoardEvent类的属性,我们只用了Key,其实还有很多:

  1. print "MessageName:", event.MessageName
  2. print "Message:", event.Message
  3. print "Time:", event.Time
  4. print "Window:", event.Window
  5. print "WindowName:", event.WindowName
  6. print "Ascii:", event.Ascii, chr(event.Ascii)
  7. print "Key:", event.Key
  8. print "KeyID:", event.KeyID
  9. print "ScanCode:", event.ScanCode
  10. print "Extended:", event.Extended
  11. print "Injected:", event.Injected
  12. print "Alt", event.Alt
  13. print "Transition", event.Transition
  14. '''
  15. 比如我按了下回车键,其返回就是:
  16. MessageName: key down
  17. Message: 256
  18. Time: 195436180
  19. Window: 329524
  20. WindowName: TmpProjects - [D:\PythonProjects\TmpProjects] - ...\tmp.py - PyCharm 5.0.3
  21. Ascii: 13
  22. Key: Return
  23. KeyID: 13
  24. ScanCode: 28
  25. Extended: 0
  26. Injected: 0
  27. Alt 0
  28. Transition 0
  29. ---
  30. '''

  其实这些里大多就是上面提到的KeyBoardEvent类中设置的一些属性。MessageName字段描述事件的名称,Message则是事件类型的编号,Time就是事件发生时间,Window是事件发生在的窗口的编号,Ascii是按键内容的ASCII码,如果不属于ASCII字符集则为0,Extended描述是否是拓展键(比如Fn+一些键用来调电脑音量,屏幕亮度等就是扩展键),Alt是指出了按键是否是Alt键(存疑。。)若是则值为32,等等……

■  鼠标事件监听基本使用

  和键盘事件类似的,鼠标事件用到了MouseEvent类,然后通过HookManager类的HookMouse方法进行监听,而关联钩子函数和事件响应函数之间的变量名可以类似于MouseLeftUp,MouseRightDown,MouseWheel,MouseMove之类的,如果不想设置这么细致也可以直接一个MouseAll来关联所有鼠标相关事件和响应函数。

  下面是一个类似于上面键盘事件监听的实例:

  1. import pyHook
  2. import pythoncom
  3.  
  4. def onMouseEvent(event):
  5. print "MessageName:",event.MessageName
  6. print "Message:", event.Message
  7. print "Time:", event.Time
  8. print "Window:", event.Window
  9. print "WindowName:", event.WindowName
  10. print "Position:", event.Position
  11. print "Wheel:", event.Wheel
  12. print "Injected:", event.Injected
  13. print"---"
  14.  
  15. return True
  16.  
  17. if __name__ == '__main__':
  18. hookmanager = pyHook.HookManager()
  19. hookmanager.MouseAll = onMouseEvent
  20. hookmanager.Mouse
  21. hookmanager.HookMouse()
  22. pythoncom.PumpMessages()
  23.  
  24. '''
  25. 部分输出结果是:
  26. MessageName: mouse move
  27. Message: 512
  28. Time: 197121396
  29. Window: 329524
  30. WindowName: TmpProjects - [D:\PythonProjects\TmpProjects] - ...\tmp.py - PyCharm 5.0.3
  31. Position: (786, 529)
  32. Wheel: 0
  33. Injected: 0
  34. ---
  35. MessageName: mouse left down
  36. Message: 513
  37. Time: 197123690
  38. Window: 329524
  39. WindowName: TmpProjects - [D:\PythonProjects\TmpProjects] - ...\tmp.py - PyCharm 5.0.3
  40. Position: (786, 529)
  41. Wheel: 0
  42. Injected: 0
  43. ---
  44. MessageName: mouse left up
  45. Message: 514
  46. Time: 197123846
  47. Window: 329524
  48. WindowName: TmpProjects - [D:\PythonProjects\TmpProjects] - ...\tmp.py - PyCharm 5.0.3
  49. Position: (786, 529)
  50. Wheel: 0
  51. Injected: 0
  52. ---
  53. MessageName: mouse wheel
  54. Message: 522
  55. Time: 197126856
  56. Window: 329524
  57. WindowName: TmpProjects - [D:\PythonProjects\TmpProjects] - ...\tmp.py - PyCharm 5.0.3
  58. Position: (786, 529)
  59. Wheel: -1
  60. Injected: 0
  61. ---
  62. 与上面这串输出对应的操作是先移动鼠标,然后点击一下左键,然后滑动了滚轮
  63. '''

  和键盘事件响应函数类似的,返回必须要有,而且当返回是False的时候,默认的鼠标事件不发生。也就是说你即使移动了鼠标,光标也不会动,造成一种假死的感觉。

最后,还需要提一下性能方面,监听鼠标&键盘事件可能会另系统无法正常工作,比如上面监测键盘事件的时候,快速地(也就是我们正常打字速度吧。。)击打键盘的时候,有时会记录不全信息,有时也会发生记录了信息但是我们的按键没有达到目的。

【pyHook】 监测键盘鼠标事件等的更多相关文章

  1. Android查询:模拟键盘鼠标事件(adb shell 实现)

    1. 发送键盘事件: 命令格式1:adb shell input keyevent “value” 其中value以及对应的key code如下表所列: KeyEvent Value KEYCODE ...

  2. soeasy的键盘鼠标事件

    在web自动化中,我们可能会遇到需要通过键盘或者鼠标去操作某些元素,那么我们就需要用到键盘事件和鼠标事件了,今天对键盘和鼠标操作进行一个总结 鼠标事件 鼠标事件需要引入ActionChains类,查看 ...

  3. 【JS】键盘鼠标事件

    一,键盘 keydown 表示按下键盘 keypress 表示按下键盘 keyup 表示键盘弹起 这三者的区别分别表现在发生的 先后顺序,获取到的键盘按钮值,已经对输入框的文本取值这三方面 先后顺序: ...

  4. (转)C#模拟键盘鼠标事件

    原文 1.模拟键盘事件System.Windows.Forms.SendKeys以下是   SendKeys   的一些特殊键代码表.     键   代码       BACKSPACE   {BA ...

  5. linux 处理键盘 鼠标事件

    Linux下鼠标和键盘的模拟控制,也就是为手势和语音控制鼠标和键盘部分服务的. 有关于本系统构建的文章结构都会由三个部分来组织,一是该功能模块的介绍和在Linux下简单应用程序的实现:二是将该功能模块 ...

  6. C#模拟键盘鼠标事件 SendKeys 的特殊键代码表(转)

    使用 SendKeys 将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用 Send.若要等待键击启动的任何进程,请使用 SendWait. 每个键都 ...

  7. Python——pyHook监听鼠标键盘事件

    pyHook包为Windows中的全局鼠标和键盘事件提供回调. 底层C库报告的信息包括事件的时间,事件发生的窗口名称,事件的值,任何键盘修饰符等. 而正常工作需要pythoncom等操作系统的API的 ...

  8. winform中键盘和鼠标事件的捕捉和重写(转)

    在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...

  9. Selenium2+python自动化12-操作元素(键盘和鼠标事件)

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

随机推荐

  1. 5.4 TLP中与数据负载相关的参数

    在PCIe总线中,有些TLP含有Data Payload,如存储器写请求.存储器读完成TLP等.在PCIe总线中,TLP含有的Data Payload大小与Max_Payload_Size.Max_R ...

  2. mysql分区之range分区

    随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...

  3. 网络请求的Cookie组成

    Cookie是由变量名和值对组成(key,value).其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中变量是用"变量=值"形式来保存.根据Netscape公司的 ...

  4. DriverStudio开发PCI设备DMA数据传输

    DriverWizard向导可以创建基本的wDM驱动程序框架,包括总线类型,地址空间,中断源,DMA资源,以及IOCTL(i/o控制代码)的定义等等.详细情况可参看DriverStudio的帮助文档, ...

  5. 笔记+R︱信用风险建模中神经网络激活函数与感知器简述

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记源于CDA-DSC课程,由常国珍老师主讲 ...

  6. FusionCharts 3D环饼图

    1.设计静态页面 Doughnut.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...

  7. FusionCharts报错收录

    FusionCharts报错 1.错误一 DesignTimeError:#25081843 flash-chart render Error >>#25081843:IECompatib ...

  8. Invalid property 'driver_class' of bean class

    1.错误描述 INFO:2015-05-01 13:06:07[localhost-startStop-1] - Initializing c3p0-0.9.2.1 [built 20-March-2 ...

  9. Flex中创建Accordion报错

    1.错误描述 2.错误原因 <mx:Accordion width="100%" height="100%"> <s:NavigatorCon ...

  10. mac下安装ELK

    本文主要为自己所走弯路而做的补充,对小白(比如我)来讲某些博客讲的还是高深了,特地来此补充说明一些东西. 主要步骤参考http://blog.csdn.net/ywheel1989/article/d ...