1 #-*- coding: utf-8 -*- 2 # 3 # by oldj 4 # http://oldj.net/ 5 # 6 7 import pythoncom 8 import pyHook 9 10 def onMouseEvent(event):11 # 监听鼠标事件12 print "MessageName:", event.MessageName13 print "Message:", event.Message14 print "Time:", event.Time15 print "Window:", event.Window16 print "WindowName:", event.WindowName17 print "Position:", event.Position18 print "Wheel:", event.Wheel19 print "Injected:", event.Injected20 print "---"21 22 # 返回 True 以便将事件传给其它处理程序23 # 注意,这儿如果返回 False ,则鼠标事件将被全部拦截24 # 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了25 return True26 27 def onKeyboardEvent(event):28 # 监听键盘事件29 print "MessageName:", event.MessageName30 print "Message:", event.Message31 print "Time:", event.Time32 print "Window:", event.Window33 print "WindowName:", event.WindowName34 print "Ascii:", event.Ascii, chr(event.Ascii)35 print "Key:", event.Key 36 print "KeyID:", event.KeyID37 print "ScanCode:", event.ScanCode38 print "Extended:", event.Extended39 print "Injected:", event.Injected40 print "Alt", event.Alt41 print "Transition", event.Transition42 print "---"43 44 # 同鼠标事件监听函数的返回值45 return True46 47 def main():48 # 创建一个“钩子”管理对象49 hm = pyHook.HookManager()50 51 # 监听所有键盘事件52 hm.KeyDown = onKeyboardEvent53 # 设置键盘“钩子”54 hm.HookKeyboard()55 56 # 监听所有鼠标事件57 hm.MouseAll = onMouseEvent58 # 设置鼠标“钩子”59 hm.HookMouse()60 61 # 进入循环,如不手动关闭,程序将一直处于监听状态62 pythoncom.PumpMessages()63 64 if __name__ == "__main__":65 main()
为了满足工具的需求,在脚本里面写了两个线程,一个线程用来发ping包,处理ping的结果数据,而另一个则是实时监控键盘的输入,一旦键盘在当前窗口输入任意字符串,则停止程序,不再发ping包,也不再记录数据,从而记录所有已记录的ping数据的总值,次数以及平均值,之前是满足需求的,但是思考之后,每次在游戏开始的时候,要切换窗口,然后执行程序,想要停止程序的时候,又要切换窗口出去,在程序窗口输入任意值,停止程序,确实很不方便,而且在Win7下,由于兼容性的问题,CF不能窗口化,全屏切换出去又比较卡,经常游戏会未响应,并且需求是要在测试CF游戏的时候,不仅仅是记录实时的ping值,更需要在某个特定的用户觉得卡的那个点,通过某种方式进行捕捉,这就需要监控到键盘的消息,而不是仅仅只是监控当前窗口的输入之类的。
在网上查找资料的时候,找到了一个很好的方法,pyhook这个库,并且还提供了相当封装好的方法,直接调用便可拿到你键盘,或者是鼠标的输入,“钩子”的方式着实是非常强大的,贴上代码,这段代码仅仅只是网上的一段引用,测试过确实是可行的,但是中间存在一点小插曲
本机安装的是python 2.7的版本,应该属于比较大众的版本,但是这个版本安装了并不会立即就支持pyhook这个库,应该说,没有集成pyhook这个库,这个库是基于另一个库pywin32的,可能是考虑这两个库的平台局限性,只能在windows上使用,所以才没有直接集成到python的安装中
最开始没有考虑到这个库不存在,因为这段代码执行的时候,报的错误是没有“pythoncom”这个库,在网上搜了很久,发现没有任何的关于这个的解决,但是com明显是基于win32的,所以抱着试一试的心态,我决定先把pywin32这个库给安装了,然后pyhook库也安装了,果然,安装之后就全部OK了。
pyWin32库的下载地址:
pyhook库的下载地址: