现在的位置: 首页 > 综合 > 正文

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

2012年12月25日 ⁄ 综合 ⁄ 共 2857字 ⁄ 字号 评论关闭
前几天看PHP的框架的时候,发现了一个强大的叫Hook(钩子)的东西,可以挂在系统的挂钩点上由系统自动运行钩子函数。搞懂PHP的钩子怎么用后,马上google了一下Python是不是也有类似Hook的功能库(哎,谁叫咱对Python情有独钟呢,学PHP时都不忘Python),结果不出所料,Python真的有Hook库唉~

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

闲话少叙,赶紧切入正题吧。Python的Hook叫pyHook,另外这个库还要搭配上另一个叫pywin32的库,其实从这个搭配可以猜出来目前Python的Hook库还只支持Windows操作系统。这点还是比较遗憾的,一点不像Python一贯的跨平台作风啊。这两个库的话,在PyPI上可以下载到,这里给个链接pyhookpywin32。我安装的是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-8

import pythoncom
import pyHook
import time, os

def onMouseEvent(event):
	# """监听鼠标事件"""
	global preWindowName, switch
	if 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  WindowName
		if not os.path.exists(mouseFilepath + datafileName):
			f = open(mouseFilepath + datafileName, "w")
			f.write("localTime				windowname\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 True

def onKeyboardEvent(event):
	"""监听键盘事件"""
	global switch
	if 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 WindowName
		if not os.path.exists(keyboardFilepath + datafileName):
			f = open(keyboardFilepath + datafileName, "w")
			f.write("localTime		keyvalue		key		windowname\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=F7
		switch = False
	if event.KeyID == 115:#Key=F4
		switch = True
	# print event.KeyID
	#同鼠标监听事件函数的返回值
	return True

def 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()

抱歉!评论已关闭.