

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.MessageName
13 print "Message:", event.Message
14 print "Time:", event.Time
15 print "Window:", event.Window
16 print "WindowName:", event.WindowName
17 print "Position:", event.Position
18 print "Wheel:", event.Wheel
19 print "Injected:", event.Injected
20 print "---"
21
22 # 返回 True 以便将事件传给其它处理程序
23 # 注意,这儿如果返回 False ,则鼠标事件将被全部拦截
24 # 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了
25 return True
26
27 def onKeyboardEvent(event):
28 # 监听键盘事件
29 print "MessageName:", event.MessageName
30 print "Message:", event.Message
31 print "Time:", event.Time
32 print "Window:", event.Window
33 print "WindowName:", event.WindowName
34 print "Ascii:", event.Ascii, chr(event.Ascii)
35 print "Key:", event.Key
36 print "KeyID:", event.KeyID
37 print "ScanCode:", event.ScanCode
38 print "Extended:", event.Extended
39 print "Injected:", event.Injected
40 print "Alt", event.Alt
41 print "Transition", event.Transition
42 print "---"
43
44 # 同鼠标事件监听函数的返回值
45 return True
46
47 def main():
48 # 创建一个“钩子”管理对象
49 hm = pyHook.HookManager()
50
51 # 监听所有键盘事件
52 hm.KeyDown = onKeyboardEvent
53 # 设置键盘“钩子”
54 hm.HookKeyboard()
55
56 # 监听所有鼠标事件
57 hm.MouseAll = onMouseEvent
58 # 设置鼠标“钩子”
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库的下载地址:http://sourceforge.net/projects/pywin32/files/
pyhook库的下载地址:http://sourceforge.net/projects/pyhook/files/