• PyHook3简明教程


    PyHook底层还是使用windows API实现,而我们可以直接拿来用的相关函数定义都在PythonLibsite-packagesPyHook3下的HookManager.py文件中。
    因为官方并没给出一个API文档,所以我自己看了一下源文件,发现其实PyHook的方法很少,用法也很简单,基本上example.py中大概都给出了。下面也是通过对example.py给出的例子的解析来了解编写过程。

    1. 创建HookManager对象

    import PyHook3
    
    hm = PyHook3.HookManager()
    

    之后的操作都是基于这个Manager对象进行。

    2. 编写事件处理函数

    事件处理函数需要传入一个HookEvent对象,这个类有两个子类,一个为鼠标事件MouseEvent,还有一个为键盘事件KeyboardEvent,分别为当触发相应事件时由系统传入。
    MouseEvent及KeyboardEvent又分别有多个属性,代表所触发事件的具体信息。example.py已经列出了所有属性,通过对example.py例子的注释,大概就能清楚了:

    # 鼠标事件处理函数
    def OnMouseEvent(event):
      print('MessageName:',event.MessageName)  #事件名称
      print('Message:',event.Message)          #windows消息常量 
      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
    
    #键盘事件处理函数
    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))   #按键的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)                          #是某同时按下Alt
      print('Transition', event.Transition)            #判断转换状态
      print('---')
    
      # 同上
      return True
    

    如果想了解具体含义,可以参考windows编程中的相关消息及参数含义。

    3. 绑定事件处理函数

    hm.MouseAllButtonsDown = OnMouseEvent #将OnMouseEvent函数绑定到MouseAllButtonsDown事件上
    hm.KeyDown = OnKeyboardEvent          #将OnKeyboardEvent函数绑定到KeyDown事件上
    

    除此之外,还有以下事件:
    鼠标事件:
    MouseAll
    MouseAllButtons
    MouseAllButtonsUp
    MouseAllButtonsDown
    MouseAllButtonsDbl
    MouseWheel
    MouseMove
    MouseLeftUp
    MouseLeftDown
    MouseLeftDbl
    MouseRightUp
    MouseRightDown
    MouseRightDbl
    MouseMiddleUp
    MouseMiddleDown
    MouseMiddleDbl
    键盘事件:
    KeyUp
    KeyDown
    KeyChar
    KeyAll
    因为都可以顾名思义,也就不再做注释。

    4. 设置钩子

    hm.HookMouse()        #设置鼠标钩子
    hm.HookKeyboard()   #设置键盘钩子
    

    5. 循环监听

    对于命令行界面的编程,设置了钩子后还不够,因为脚本在成功挂钩后,就结束运行了。这个时候就需要使程序进入循环监听系统事件的状态。
    比较简单的方法是使用Win32 Extensions package提供的PumpMessages()方法:

      import pythoncom
      pythoncom.PumpMessages()
    

    但是这个函数不是PyHook编程中必需的。如果是基于某些GUI库的编程,则不需要这样,因为GUI库本身就具有监听消息循环的机制。

    6. 取消钩子

    hm.UnhookMouse()    #取消鼠标钩子
    hm.UnhookKeyboard() #取消键盘钩子
    
  • 相关阅读:
    OpenStreetMap、googleMap等经纬度和行列号之间相互转化(python,JavaScript,php,Java,C#等)
    利用whoosh对mongoDB的中文文档建立全文检索
    js前端读写文件的方法(json、excel)
    部分网站公开数据的汇总(1)
    部分网站公开数据的汇总(2)
    Buuctf-misc-[BJDCTF 2nd]最简单的misc-y1ng
    Buuctf-web-[SUCTF 2019]CheckIn
    Buuctf-web-[ACTF2020 新生赛]Upload
    Buuctf-web-[ACTF2020 新生赛]BackupFile
    Buuctf-web-[极客大挑战 2019]Upload
  • 原文地址:https://www.cnblogs.com/enumx/p/12332694.html
Copyright © 2020-2023  润新知