Python实现鼠标、键盘事件的记录

来源:互联网 发布:淘宝折扣价在哪设置 编辑:程序博客网 时间:2024/05/21 13:14
前几天看PHP的框架的时候,发现了一个强大的叫Hook(钩子)的东西,可以挂在系统的挂钩点上由系统自动运行钩子函数。搞懂PHP的钩子怎么用后,马上google了一下Python是不是也有类似Hook的功能库(哎,谁叫咱对Python情有独钟呢,学PHP时都不忘Python),结果不出所料,Python真的有Hook库唉~

--------------------------------我是分割线-------------------------------------

闲话少叙,赶紧切入正题吧。Python的Hook叫pyHook,另外这个库还要搭配上另一个叫pywin32的库,其实从这个搭配可以猜出来目前Python的Hook库还只支持Windows操作系统。这点还是比较遗憾的,一点不像Python一贯的跨平台作风啊。这两个库的话,在PyPI上可以下载到,这里给个链接pyhook,pywin32。我安装的是pyHook-1.5.1.win32-py2.7和pywin32-218.win32-py2.7这两个版本的库。这里再给个pyHook的官方教程。你会发现这是很简单实用的一个库,只要你有创意可以拿它来做很多事。另外这两个库配置要求Python2.4及windows2000以上。这两个库下载下来后,都带有exe文件,运行按默认方式直接安装就行了。安装完成后,可以测试运行import pyHook, pythoncom,如果没有报错,那么恭喜你安装成功,可以开始code啦!


程序的思路很简单 ,先用pyHook的HookManager方法创建一个钩子对象,然后在键盘和鼠标的挂钩点挂上自己定制的回调函数,开启钩子,最后利用pythoncom(pywin32安装后自带)的PumpMessages方法开启一个windows消息就行了。这个监听状态可以通过kill掉进程结束。在回调函数里,我在根目录下建了log/keyboard/和log/mouse/两个路径,分别存放键盘和鼠标的日志。键盘日志里,按时间顺序记录了对应时间的键盘输入、窗口名字等信息,鼠标日志里,按时间顺序记录了窗口名字信息。另外,还增加了快捷键功能,F7键用于关闭日志功能(进程仍监听只是不记录信息),F4键用于再次开启。其实这个程序本身算是个示例程序,比较清楚,但是这个功能还是很有意义的,可以作为后续统计或者机器学习的原始数据,背后的结论应该是很有代表性的。比如可以分析自己,在开电脑的时候各个活动所占的时间比例,或者键盘上哪些键甚至哪些组合键使用频率比较高等等。

这里直接贴源码好啦。读源码神马的最有爱了。

#!/usr/bin/env python#encoding=utf-8import pythoncomimport pyHookimport time, osdef onMouseEvent(event):# """监听鼠标事件"""global preWindowName, switchif not os.path.exists(mouseFilepath):os.makedirs(mouseFilepath)if switch:localTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())datafileName = localTime[:localTime.find(" ")] + ".txt"#time  WindowNameif not os.path.exists(mouseFilepath + datafileName):f = open(mouseFilepath + datafileName, "w")f.write("localTimewindowname\n")f.close()if type(event.WindowName) ==  str: if event.WindowName != preWindowName:datafileContent = localTime + ',' + event.WindowName + '\n'f = open(mouseFilepath + datafileName, "a")f.write(datafileContent)f.close()preWindowName = event.WindowName#返回True以便将事件传给其他处理程序return Truedef onKeyboardEvent(event):"""监听键盘事件"""global switchif not os.path.exists(keyboardFilepath):os.makedirs(keyboardFilepath)if switch:localTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())datafileName = localTime[:localTime.find(" ")] + ".txt"#time keyvalue Key WindowNameif not os.path.exists(keyboardFilepath + datafileName):f = open(keyboardFilepath + datafileName, "w")f.write("localTimekeyvaluekeywindowname\n")f.close()if type(event.WindowName) ==  str:datafileContent = localTime + ',' + chr(event.Ascii) + ',' \+ event.Key + ',' + event.WindowName + '\n'f = open(keyboardFilepath + datafileName, "a")f.write(datafileContent)f.close()if event.KeyID == 118:#Key=F7switch = Falseif event.KeyID == 115:#Key=F4switch = True# print event.KeyID#同鼠标监听事件函数的返回值return Truedef main():"""创建一个'钩子'管理对象"""hm = pyHook.HookManager()#监听所有键盘事件hm.KeyDown = onKeyboardEvent#设置键盘'钩子'hm.HookKeyboard()#监听所有鼠标事件hm.MouseAll = onMouseEvent#设置鼠标'钩子'hm.HookMouse()#进入循环,如不手动关闭,程序将一直处于监听状态pythoncom.PumpMessages()if __name__ == '__main__':keyboardFilepath = "./log/keyboard/"mouseFilepath = "./log/mouse/"preWindowName = ''switch = True #控制是否开启日志功能main()
	
				
		
原创粉丝点击