PyHook3详细教程

PyHook(hook:n.钩;钓钩;挂钩)是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。

安装

现在我们使用的Python绝大部分都是3代

但pyhook只支持Python2代 Python3要用PyHook3

而安装PyHook3,还要安装Swig,pywin32,visual stdio 2019······

所以想要安装尽量找个教程,比如我的博文

Python小白·暗某人的博文:PyHook3安装(亲测有用)

使用

关于PyHook的使用,网上大多流传的是在它的官方主页上简单的教程,大体上来说,可以这样使用

# -*-coding:utf-8 -*-
import pythoncom
import pyHook
def onMouseEvent(event):
 
    # 监听鼠标事件
    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
 
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
 
def main():
  # 创建一个“钩子”管理对象
  hm = pyHook.HookManager()
  # 监听所有键盘事件
  hm.KeyDown = onKeyboardEvent
  # 设置键盘“钩子”
  hm.HookKeyboard()
  # 监听所有鼠标事件
  hm.MouseAll = onMouseEvent
  # 设置鼠标“钩子”
  hm.HookMouse()
  # 进入循环,如不手动关闭,程序将一直处于监听状态
  pythoncom.PumpMessages()
 
if __name__ == "__main__":
  main()


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

这个教程写的很笼统

以至于我读了8次才明白所以

我改个说法讲一下:

PS:如果import pythoncom报错,就在cmd里输入

pip install pythoncom

鼠标操作

基本信息输出

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHook
def onMouseEvent(event):
    print('当前进行了',event.MessageName,'操作')
    print('操作号:', event.Message)
    print('时间:', event.Time)
    print('鼠标停留在', event.Window,'编号的窗口')
    print('鼠标停留在', event.WindowName,'窗口')
    print('鼠标在', event.Position,'坐标')
    print('滚轮向', event.Wheel,'方向转')
    print('Injected:', event.Injected)  #小编也不知道是啥
    print('---分隔符---')
   
    return True # 返回 True 以便将事件传给其它处理程序,
    #注意,这儿如果返回 False ,则鼠标事件将被全部拦,也就是说你的鼠标看起来会僵在那儿,似乎失去响应了
 
def main():
  hm = pyHook.HookManager()# 创建一个“钩子”管理对象
  hm.MouseAll = onMouseEvent# 监听基本操作
  hm.HookMouse()# 设置鼠标“钩子”
  pythoncom.PumpMessages()# 进入循环,如不手动关闭,程序将一直处于监听状态
 
if __name__ == "__main__":
  main()

鼠标按键操作

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHook

def onMouseAllButtons(event):
    print('有鼠标按键操作')
    return True # 返回 True 以便将事件传给其它处理程序,
    #注意,这儿如果返回 False ,则鼠标事件将被全部拦,也就是说你的鼠标看起来会僵在那儿,似乎失去响应了
 
def onMouseAllButtonsUP(event):
    print('有鼠标按键抬起')
    return True

def onMouseAllButtonsDown(event):
    print('有鼠标按键按下')
    return True

def onMouseAllButtonsDbl(event):
    print('有鼠标按键双击')
    return True 

def main():
  hm = pyHook.HookManager()# 创建一个“钩子”管理对象
  hm.MouseAllButtons = onMouseAllButtons    #监测鼠标所有按键操作
  hm.MouseAllButtonsUp = onMouseAllButtonsUP    #监测鼠标所有按键抬起(检测到抬起需要按下后抬起)
  hm.MouseAllButtonsDown = onMouseAllButtonsDown    #监测鼠标所有按键按下
  hm.MouseAllButtonsDbl = onMouseAllButtonsDbl    #监测鼠标所有按键双击
  hm.HookMouse()# 设置鼠标“钩子”
  pythoncom.PumpMessages()# 进入循环,如不手动关闭,程序将一直处于监听状态
 
if __name__ == "__main__":
  main()

左键信息(其他按键把Left换成Right,Middle即可,暂不支持侧键)

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHook

def onMouseMove(event):
    print('鼠标移动')
    return True # 返回 True 以便将事件传给其它处理程序,
    #注意,这儿如果返回 False ,则鼠标事件将被全部拦,也就是说你的鼠标看起来会僵在那儿,似乎失去响应了
 
def onMouseLeftUp(event):
    print('鼠标左键抬起')
    return True

def onMouseLeftDown(event):
    print('有鼠标左键按下')
    return True

def onMouseLeftDbl(event):
    print('鼠标左键双击')
    return True 

def main():
    hm = pyHook.HookManager()# 创建一个“钩子”管理对象
    hm.MouseMove = onMouseMove    #监测鼠标所有按键操作
    hm.MouseLeftUp = onMouseLeftUp    #监测鼠标所有按键抬起(检测到抬起需要按下后抬起)
    hm.MouseLeftDown = onMouseLeftDown    #监测鼠标所有按键按下
    hm.MouseLeftDbl = onMouseLeftDbl    #监测鼠标所有按键双击 
    hm.HookMouse()# 设置鼠标“钩子”
    pythoncom.PumpMessages()# 进入循环,如不手动关闭,程序将一直处于监听状态
 
if __name__ == "__main__":
  main()

键盘操作

基本信息操作

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHook
 
def onKeyboardEvent(event):
 # 监听键盘事件
  print('当前进行了', event.MessageName,'操作')
  print("Message:", event.Message)  #消息? 小编不知道是啥
  print('时间:', event.Time)
  print('窗口编号:', event.Window)
  print('窗口名称', event.WindowName)
  print("Ascii:", event.Ascii, chr(event.Ascii))  #?
  print('当前按下了', event.Key,'按键')
  print('按下的按键编号是', event.KeyID)
  print("ScanCode:", event.ScanCode)  #?      
  print('是否为功能键:', event.Extended)
  print("Injected:", event.Injected) #小编又不知道是啥了
  print('是否为Alt', event.Alt)
  print("Transition", event.Transition)  #?
  print('---  分隔符---')
  # 同鼠标事件监听函数的返回值
  return True
 
def main():
  hm = pyHook.HookManager()  # 创建一个“钩子”管理对象
  hm.KeyDown = onKeyboardEvent  # 监听所有键盘按下事件
  hm.HookKeyboard() # 设置键盘“钩子”
  pythoncom.PumpMessages() # 进入循环,如不手动关闭,程序将一直处于监听状态
 
if __name__ == "__main__":
  main()  

其他检测 

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHook
 
def onKeyAll(event):
  print('当前有键盘操作')
  # 同鼠标事件监听函数的返回值
  return True

def onKeyUp(event):
  print('当前有键盘抬起')
  return True

def onKeyDown(event):
  print('当前有键盘按下')
  return True
 
def main():
  hm = pyHook.HookManager()  # 创建一个“钩子”管理对象
  hm.KeyAll = onKeyAll   # 监听所有键盘事件
  hm.KeyUp = onKeyUp
  hm.KeyDown = onKeyDown
  hm.HookKeyboard() # 设置键盘“钩子”
  pythoncom.PumpMessages() # 进入循环,如不手动关闭,程序将一直处于监听状态
 
if __name__ == "__main__":
  main()  

实例&拓展

这是我用多个库制作的,具体功能见注释

from turtle import *    #用于绘画
from pyautogui import *    #用于检测鼠标位置
from random import *    #用于随机
from itertools import cycle    #用于无限随机
import PyHook3 as pyhook    #用于检测操作

cycle_iter = cycle([100, 200, 300])
hm = pyhook.HookManager()  
color = ['snow','ghost white','white smoke','gainsboro', 'floral white', 'old lace','linen', 'antique white', 'papaya whip', 'blanched almond', 'bisque', 'peach puff','navajo white', 'lemon chiffon', 'mint cream', 'azure', 'alice blue', 'lavender','lavender blush', 'misty rose', 'dark slate gray', 'dim gray', 'slate gray', 'light slate gray', 'gray', 'light grey', 'midnight blue', 'navy', 'cornflower blue', 'dark slate blue','slate blue', 'medium slate blue', 'light slate blue', 'medium blue', 'royal blue',  'blue','dodger blue', 'deep sky blue', 'sky blue', 'light sky blue', 'steel blue', 'light steel blue','light blue', 'powder blue', 'pale turquoise', 'dark turquoise', 'medium turquoise', 'turquoise','cyan', 'light cyan', 'cadet blue', 'medium aquamarine', 'aquamarine', 'dark green', 'dark olive green','dark sea green', 'sea green', 'medium sea green', 'light sea green', 'pale green', 'spring green','lawn green', 'medium spring green', 'green yellow', 'lime green', 'yellow green','forest green', 'olive drab', 'dark khaki', 'khaki', 'pale goldenrod', 'light goldenrod yellow','light yellow', 'yellow', 'gold', 'light goldenrod', 'goldenrod', 'dark goldenrod', 'rosy brown','indian red', 'saddle brown', 'sandy brown','dark salmon', 'salmon', 'light salmon', 'orange', 'dark orange','coral', 'light coral', 'tomato', 'orange red', 'red', 'hot pink', 'deep pink', 'pink', 'light pink','pale violet red', 'maroon', 'medium violet red', 'violet red','medium orchid', 'dark orchid', 'dark violet', 'blue violet', 'purple', 'medium purple','thistle', 'snow2', 'snow3','snow4', 'seashell2', 'seashell3', 'seashell4', 'AntiqueWhite1', 'AntiqueWhite2','AntiqueWhite3', 'AntiqueWhite4', 'bisque2', 'bisque3', 'bisque4', 'PeachPuff2','PeachPuff3', 'PeachPuff4', 'NavajoWhite2', 'NavajoWhite3', 'NavajoWhite4','LemonChiffon2', 'LemonChiffon3', 'LemonChiffon4', 'cornsilk2', 'cornsilk3','cornsilk4', 'ivory2', 'ivory3', 'ivory4', 'honeydew2', 'honeydew3', 'honeydew4','LavenderBlush2', 'LavenderBlush3', 'LavenderBlush4', 'MistyRose2', 'MistyRose3','MistyRose4', 'azure2', 'azure3', 'azure4', 'SlateBlue1', 'SlateBlue2', 'SlateBlue3','SlateBlue4', 'RoyalBlue1', 'RoyalBlue2', 'RoyalBlue3', 'RoyalBlue4', 'blue2', 'blue4','DodgerBlue2', 'DodgerBlue3', 'DodgerBlue4', 'SteelBlue1', 'SteelBlue2','SteelBlue3', 'SteelBlue4', 'DeepSkyBlue2', 'DeepSkyBlue3', 'DeepSkyBlue4','SkyBlue1', 'SkyBlue2', 'SkyBlue3', 'SkyBlue4', 'LightSkyBlue1','LightSkyBlue2','LightSkyBlue3', 'LightSkyBlue4', 'SlateGray1', 'SlateGray2', 'SlateGray3','SlateGray4', 'LightSteelBlue1', 'LightSteelBlue2', 'LightSteelBlue3','LightSteelBlue4', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4','LightCyan2', 'LightCyan3', 'LightCyan4', 'PaleTurquoise1', 'PaleTurquoise2','PaleTurquoise3', 'PaleTurquoise4', 'CadetBlue1', 'CadetBlue2', 'CadetBlue3','CadetBlue4', 'turquoise1', 'turquoise2', 'turquoise3', 'turquoise4', 'cyan2', 'cyan3','cyan4', 'DarkSlateGray1', 'DarkSlateGray2', 'DarkSlateGray3', 'DarkSlateGray4','aquamarine2', 'aquamarine4', 'DarkSeaGreen1', 'DarkSeaGreen2', 'DarkSeaGreen3','DarkSeaGreen4', 'SeaGreen1', 'SeaGreen2', 'SeaGreen3', 'PaleGreen1', 'PaleGreen2','PaleGreen3', 'PaleGreen4', 'SpringGreen2', 'SpringGreen3', 'SpringGreen4','green2', 'green3', 'green4', 'chartreuse2', 'chartreuse3', 'chartreuse4','OliveDrab1', 'OliveDrab2', 'OliveDrab4', 'DarkOliveGreen1', 'DarkOliveGreen2', 'DarkOliveGreen3', 'DarkOliveGreen4', 'khaki1', 'khaki2', 'khaki3', 'khaki4', 'LightGoldenrod1', 'LightGoldenrod2', 'LightGoldenrod3', 'LightGoldenrod4',  'LightYellow2', 'LightYellow3', 'LightYellow4', 'yellow2', 'yellow3', 'yellow4',  'gold2', 'gold3', 'gold4', 'goldenrod1', 'goldenrod2', 'goldenrod3', 'goldenrod4','DarkGoldenrod1', 'DarkGoldenrod2', 'DarkGoldenrod3', 'DarkGoldenrod4','RosyBrown1', 'RosyBrown2', 'RosyBrown3', 'RosyBrown4', 'IndianRed1', 'IndianRed2','IndianRed3', 'IndianRed4', 'sienna1', 'sienna2', 'sienna3', 'sienna4', 'burlywood1','burlywood2', 'burlywood3', 'burlywood4', 'wheat1', 'wheat2', 'wheat3', 'wheat4', 'tan1','tan2', 'tan4', 'chocolate1', 'chocolate2', 'chocolate3', 'firebrick1', 'firebrick2','firebrick3', 'firebrick4', 'brown1', 'brown2', 'brown3', 'brown4', 'salmon1', 'salmon2','salmon3', 'salmon4', 'LightSalmon2', 'LightSalmon3', 'LightSalmon4', 'orange2','orange3', 'orange4', 'DarkOrange1', 'DarkOrange2', 'DarkOrange3', 'DarkOrange4','coral1', 'coral2', 'coral3', 'coral4', 'tomato2', 'tomato3', 'tomato4', 'OrangeRed2','OrangeRed3', 'OrangeRed4', 'red2', 'red3', 'red4', 'DeepPink2', 'DeepPink3', 'DeepPink4','HotPink1', 'HotPink2', 'HotPink3', 'HotPink4', 'pink1', 'pink2', 'pink3', 'pink4','LightPink1', 'LightPink2', 'LightPink3', 'LightPink4', 'PaleVioletRed1','PaleVioletRed2', 'PaleVioletRed3', 'PaleVioletRed4', 'maroon1', 'maroon2','maroon3', 'maroon4', 'VioletRed1', 'VioletRed2', 'VioletRed3', 'VioletRed4','magenta2', 'magenta3', 'magenta4', 'orchid1', 'orchid2', 'orchid3', 'orchid4', 'plum1','plum2', 'plum3', 'plum4', 'MediumOrchid1', 'MediumOrchid2', 'MediumOrchid3','MediumOrchid4', 'DarkOrchid1', 'DarkOrchid2', 'DarkOrchid3', 'DarkOrchid4','purple1', 'purple2', 'purple3', 'purple4', 'MediumPurple1', 'MediumPurple2','MediumPurple3', 'MediumPurple4', 'thistle1', 'thistle2', 'thistle3', 'thistle4','gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10','gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19','gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28','gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37','gray38', 'gray39', 'gray40', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47','gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56','gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65','gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74','gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83','gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92','gray93', 'gray94', 'gray95', 'gray97', 'gray98', 'gray99']

def onMouseLeft(event): 
    pencolor(color[randint(0,422)])    #随机更换颜色
    print('color Ture')
    return True

def onMouseRight(event): 
    clear()    #清除画布
    print('clear Ture')
    return True

def onMouseMiddle(event): 
    circle(50)    #画圆
    print('circle Ture')
    return True

speed(0)    #设置速度
pencolor(color[randint(0,422)])    #设置随机颜色
pensize(20)    #设置粗细度
setup(width=1920, height=1080, startx=None, starty=None)    #设定画布

for i in cycle_iter:
    x,y = position() #获取鼠标当前位置
    x = x - 960    #将坐标值设为和turtle坐标
    y = y*-1 + 540
    goto(x,y)    #移动画笔
    hm.MouseLeftDown = onMouseLeft    #绑定左键换色函数
    hm.MouseRightDown = onMouseRight    #绑定右键清楚函数
    hm.MouseMiddleDown = onMouseMiddle    #绑定中键画圆函数
    hm.HookMouse()

灵感来源:

eftales的简书文章:pyhook监视键盘鼠标

from ctypes import *
import PyHook3 as pyHook
import pythoncom


def onKeyboardEvent(event):
    print("onKeyboardEvent")
    pid = c_ulong(0)
    windowTitle = create_string_buffer(512)
    windll.user32.GetWindowTextA(event.Window, byref(windowTitle), 512)
    windll.user32.GetWindowThreadProcessId(event.Window, byref(pid))
    windowName = windowTitle.value.decode('gbk')
    print("当前您处于%s窗口" % windowName)
    print("当前窗口所属进程id %d" % pid.value)
    print("当前刚刚按下了%s键" % str(event.Ascii))
    return True


hm = pyHook.HookManager()
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

本篇文章到此结束,如有疑惑和建议,欢迎在评论区留言哦


















#既然看了,就点个关注吧

猜你喜欢

转载自blog.csdn.net/anmouewn/article/details/128873434