其实我们外挂中的技术阻碍基本都扫除了,接下来只需要把前两次的代码装配在一起就可以了。不过直接在这篇文章里将全部代码贴出来实在有违自己的心意,我还是要讲述一点有含量的东西才可以~
外挂在不停的操控你的鼠标,你要是想和它抢,那是很困难的,也许我们可以选择关闭它~ 但是如何关闭也是一个极具挑战性的事情,它在cmd命令行窗口中运行,同时在不停点击浏览器,所以浏览器窗口会在前面,你很难选中命令行窗口并关闭它(Ctrl+c或者Alt+F4甚至用鼠标点击X),如果真的做到了,也许一可以考虑到W3C大赛里表演一番:)
只有快捷键可以在窗口在我们视野之外的时候依然对其进行控制。我们只讨论Windows下的快捷键机制,这里有MSDN上关于RegisterHotKey的API说明,Windows就是使用这个API进行系统级别的快捷键注册的,有Windows编程基础的孩纸乐坏了,都是小case啊,想我这种对Windows底层(其实根本不算底层,这不给自己留点面子么)不甚了解的人就有点伤心了,同时天涯沦落人,我就直接贴代码吧:
import ctypes, win32con, ctypes.wintypes, win32gui
EXIT = False
class Hotkey(threading.Thread):
def run(self):
global EXIT
user32 = ctypes.windll.user32
if not user32.RegisterHotKey(None, 99, win32con.MOD_WIN, win32con.VK_F3):
raise RuntimeError
try:
msg = ctypes.wintypes.MSG()
print msg
while user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
if msg.message == win32con.WM_HOTKEY:
if msg.wParam == 99:
EXIT = True
return
user32.TranslateMessage(ctypes.byref(msg))
user32.DispatchMessageA(ctypes.byref(msg))
finally:
user32.UnregisterHotKey(None, 1)
吓坏了?relax,其实也不复杂,pywin32包能够方便的引入dll并调用其中的api函数,查看MSDN,可以知道RegisterHotKey来自user32.dll文件,它的参数分别是窗口句柄、快捷键标示、组合键和虚拟键。我在消息队列中等待处理事件,如果标示符合,就执行我们自己的代码,否则继续传给系统。具体我也不多解释了,找本Windows编程的书看看就明白了(别找Visual xxx快速入门之类的,那是学龄前孩子看的),记住判断快捷键冲突,程序完事了要释放快捷键就好了。Win + F3退出程序,希望你看代码发现了这个。
这里我把它写成了一个Thread.threading的扩展类,这样可以作为一个线程启动,因为Windows系统在等待按键的时候是阻塞的,那样我们的外挂就不动啦!用一个全局变量来作为按下退出快捷键的标志,这里赞一下Python,虽然不知道是不是标准做法,但是一个global就能让变量在不同线程中共享,实在很方便,有其他语言进行线程编程的童鞋一定深有感触。
def TopmostMe():
hwnd = win32gui.GetForegroundWindow()
(left, top, right, bottom) = win32gui.GetWindowRect(hwnd)
win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, left, top, right-left, bottom-top, 0)
这段代码很神奇,运行之后,命令行窗口就总在最前了,这样查看实时的输出就很方便,否则浏览器窗口会阻挡它的。也是很简单的东西,但是我觉得应该有更好的方法,有没有什么方法可以直接给这个窗口设置总在最前的标志而不需要同时设置它的位置?望指教!
好了,我直接放出源码和图片,省的各位拼拼接接了。一般情况下,这个代码是不能直接用的,除非你和我一样使用Chrome浏览器,1366×768的屏幕,事实上我都不知道它在XP下能不能正常工作…… 首先你需要更改文件头部的L, T = 234, 167,把它修改为你屏幕上的游戏图像起点坐标,请参考前两篇的内容,接下来请自行测试、debug、享受……反正我用这脚本玩游戏毫无压力,后来觉得太无趣才关了,不知道它能过几关~~有兴趣的朋友请试一试呀。
我们从这个系列中学到了什么?乐趣:)