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.MessageNameprint "Message:", event.Messageprint "Time:", event.Timeprint "Window:", event.Windowprint "WindowName:", event.WindowNameprint "Position:", event.Positionprint "Wheel:", event.Wheelprint "Injected:", event.Injectedprint"---"# 返回 True 以便将事件传给其它处理程序# 注意,这儿如果返回 False ,则鼠标事件将被全部拦截# 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了return Truedef onKeyboardEvent(event):# 监听键盘事件print "MessageName:", event.MessageNameprint "Message:", event.Messageprint "Time:", event.Timeprint "Window:", event.Windowprint "WindowName:", event.WindowNameprint "Ascii:", event.Ascii, chr(event.Ascii)print "Key:", event.Keyprint "KeyID:", event.KeyIDprint "ScanCode:", event.ScanCodeprint "Extended:", event.Extendedprint "Injected:", event.Injectedprint "Alt", event.Altprint "Transition", event.Transitionprint "---"# 同鼠标事件监听函数的返回值return Truedef 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 pyHookdef onMouseAllButtons(event):print('有鼠标按键操作')return True # 返回 True 以便将事件传给其它处理程序,#注意,这儿如果返回 False ,则鼠标事件将被全部拦,也就是说你的鼠标看起来会僵在那儿,似乎失去响应了def onMouseAllButtonsUP(event):print('有鼠标按键抬起')return Truedef onMouseAllButtonsDown(event):print('有鼠标按键按下')return Truedef 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 pyHookdef onMouseMove(event):print('鼠标移动')return True # 返回 True 以便将事件传给其它处理程序,#注意,这儿如果返回 False ,则鼠标事件将被全部拦,也就是说你的鼠标看起来会僵在那儿,似乎失去响应了def onMouseLeftUp(event):print('鼠标左键抬起')return Truedef onMouseLeftDown(event):print('有鼠标左键按下')return Truedef 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 pyHookdef 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 Truedef main():hm = pyHook.HookManager()  # 创建一个“钩子”管理对象hm.KeyDown = onKeyboardEvent  # 监听所有键盘按下事件hm.HookKeyboard() # 设置键盘“钩子”pythoncom.PumpMessages() # 进入循环,如不手动关闭,程序将一直处于监听状态if __name__ == "__main__":main()  

其他检测

# -*-coding:utf-8 -*-
import pythoncom
import PyHook3 as pyHookdef onKeyAll(event):print('当前有键盘操作')# 同鼠标事件监听函数的返回值return Truedef onKeyUp(event):print('当前有键盘抬起')return Truedef onKeyDown(event):print('当前有键盘按下')return Truedef main():hm = pyHook.HookManager()  # 创建一个“钩子”管理对象hm.KeyAll = onKeyAll   # 监听所有键盘事件hm.KeyUp = onKeyUphm.KeyDown = onKeyDownhm.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 Truedef onMouseRight(event): clear()    #清除画布print('clear Ture')return Truedef onMouseMiddle(event): circle(50)    #画圆print('circle Ture')return Truespeed(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 + 540goto(x,y)    #移动画笔hm.MouseLeftDown = onMouseLeft    #绑定左键换色函数hm.MouseRightDown = onMouseRight    #绑定右键清楚函数hm.MouseMiddleDown = onMouseMiddle    #绑定中键画圆函数hm.HookMouse()

灵感来源:

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

from ctypes import *
import PyHook3 as pyHook
import pythoncomdef 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 Truehm = pyHook.HookManager()
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

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

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

PyHook3详细教程相关推荐

  1. 手把手从零开始搭建k8s集群超详细教程

    本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...

  2. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护

    全面优化win10电脑系统详细教程 以下针对win10系统的电脑全面优化的步骤: 步骤1:禁止开机启动项 1.首先我们先来优化开机速度,拖慢开机速度的首先是开机自启动项,Ctrl + Shift + ...

  3. GPU运行Tensorflow详细教程及错误解决

    GPU运行Tensorflow详细教程及错误解决 前提条件 配置GPU运行 确认是否成功配置 出现的错误及解决方案 前提条件 最重要的一点:CUDA与tensorflow的版本一点要对应,不然用不了! ...

  4. VMware虚拟机安装黑苹果MacOS Mojave系统详细教程

    更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题.查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行. ...

  5. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )

    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...

  6. win七系统如何卸载MySQL_win7系统卸载SQL2008R2数据库的详细教程

    用过SQL2008R2数据库的朋友都知道,安装起来容易卸起来麻烦,可是在win7 32位旗舰版系统就不知道怎么卸载SQL2008R2数据库了.其实卸载SQL2008R2数据库的方法也很简单,可直接通过 ...

  7. Ubuntu系统安装搜狗输入法详细教程

    Ubuntu16.04系统安装搜狗输入法详细教程 解决Ubuntu 18.04中文输入法的问题,安装搜狗拼音

  8. PHP7Grafika,PHP图片处理库Grafika详细教程(3):图像属性处理

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(2):图像特效处理模块>,由于grafika功能太多,所以分开写,其他的点击这里 该文章主要写grafika的图像 ...

  9. mysql.msi卸载_MySql安装与卸载的详细教程

    本文为大家分享了MySql安装与卸载的教程,供大家参考,具体内容如下 一.MYSQL的安装 1.打开下载的mysql安装文件,双击运行mysql-5.5.40-win32.msi. 2.选择安装类型, ...

最新文章

  1. bootstrap 导航学习
  2. 阿里高级算法专家公开10大思考
  3. SAP ABAP Platform 1909最新版的 docker 镜像
  4. yaf mysql pdo 封装_PDO 操作数据库
  5. iOS 模拟器下载与安装
  6. Python转换图片大小格式
  7. 【Arduino】步进电机驱动程序Stepper_Motor_TB6600
  8. java jersey_Jersey框架
  9. 将一个3x4阶矩阵转置。
  10. 持久性连接和非持久性连接
  11. 宝塔同时安装苹果cms海洋cms_海洋cms新手入门安装配置教程
  12. 【FPGA混沌】基于FPGA的混沌系统verilog实现
  13. 软件测试肖sir__006xmind思维导图实战__微信发红包
  14. 如何查看直播间在线人数?观看软件数据分析
  15. html语言下上标对齐,HTML 标记语言全面详细解 一天学会
  16. 5.AVStream和AVCodecParameters
  17. 去哪儿网马文: ESAAS平台技术开发实战
  18. PCIe to CAN Linux 驱动详细说明
  19. 北大扫地僧“火”了!手提馒头矿泉水的他,是博士毕业1年就成北大助理教授的90后!...
  20. 如何管教患有拖延症的娃

热门文章

  1. Android手机通过USB线共享电脑的网络上网
  2. 夏季忌发怒 适当午休抗疲劳
  3. revit二次开发lookup和addin的详细安装教程
  4. 千寻 SDK 集成开发指南 v1.1.7
  5. kaldi查看不同文件的命令集锦
  6. [Unity实战]仅用2步-虚拟相机Cinemachine简易使用
  7. Excel表格函数判断身份证号是否正确
  8. 晶体管共射极单管放大电路
  9. 如何准确查询网易邮箱和微软邮箱的注册时间
  10. 数字手势识别App--(2)图像处理