python一次简单游戏辅助的经历(截取屏幕模拟键盘)

背景:忆起10年前玩过的网游《热血江湖》。游戏中不定时出现可使用必杀技提示,需要在此时键盘按键(必杀技需根据提示按多个键位)才可使用。

思路一:通过python调用windows大漠插件dm.dll,使用插件中封装好的函数来操作。但是XP系统使用python的win32模块总是报错(可能系统问题),虽然换了win7就正常了,感觉不爽,于是有了思路二。

思路二:PIL定时获取指定位置图片,与按键提示图片对比,如匹配则模拟按对应按键。

上代码结合注释(通过游戏内聊天输入框测试通过):

#coding:utf-8

from ctypes import *

from PIL import ImageGrab, Image

import ctypes

import math

import operator

import time

import win32gui

import win32api

import win32con

import win32com.client

class RECT(ctypes.Structure):

_fields_ = [('left', ctypes.c_int),

('top', ctypes.c_int),

('right', ctypes.c_int),

('bottom', ctypes.c_int)]

def get_image_histogram(imgobj):

return imgobj.histogram()

def pil_image_similarity(h1, h2):

rms = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )

return rms

if __name__=='__main__':

time.sleep(5) #首先休眠5秒,留出时间从cmd窗口切换至游戏窗口

print 'start'

dm = win32com.client.Dispatch('dm.dmsoft' ) #调用大漠插件

h_a = get_image_histogram(Image.open('a.jpg'))

h_d = get_image_histogram(Image.open('d.jpg'))

h_s = get_image_histogram(Image.open('s.jpg'))

HISTS = {'a.jpg': h_a, 'd.jpg': h_d, 's.jpg': h_s}

s = 0 #成功按键计数器

while 1:

try:

rect = RECT()

HWND = win32gui.GetForegroundWindow()#获取当前窗口句柄

ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))#获取当前窗口坐标

coordinate = (rect.left+385, rect.top+400, rect.right-390, rect.bottom-195)#转换为预截图窗口坐标,根据游戏调整

pic = ImageGrab.grab(coordinate)#截图

pic.save('123.jpg')

pic = Image.open('123.jpg') #将截图对象换成Image对象,这样histogram结果才准确

h_pic = get_image_histogram(pic)

#按键提示的原图片和对应键码值

img_list = {'a.jpg': 65, 'd.jpg': 68, 's.jpg': 83}

for img in img_list.keys():

if(pil_image_similarity(HISTS[img], h_pic)

dm.keypress(img_list[img]) #如匹配则调用大漠插件函数按下对应键

if img=='d.jpg':

s += 1 #成功完成连击,计数器++

print '%s ok' % s

break

except:

pass

time.sleep(1) #游戏按键提示持续2-3秒,休眠一秒节省资源

结局:轻看了这款已入末路,bug百出的游戏。它的防外挂可以识别windows消息模拟按键,除聊天框可以模拟输入成功外,其余均失败。

应对方法:第二天使用了大漠插件的硬件模拟,搞定收工。

备注:实际上整个过程都可以用大漠完成,而且还能兼容当前/非当前窗口、多进程等情况。但用自己写的脚本感觉更cool~

最后:使用大漠插件不要忘记注册dm.dll到电脑中。

背景:忆起10年前玩过的网游《热血江湖》。游戏中不定时出现可使用必杀技提示,需要在此时键盘按键(必杀技需根据提示按多个键位)才可使用。

思路一:通过python调用windows大漠插件dm.dll,使用插件中封装好的函数来操作。但是XP系统使用python的win32模块总是报错(可能系统问题),虽然换了win7就正常了,感觉不爽,于是有了思路二。

思路二:PIL定时获取指定位置图片,与按键提示图片对比,如匹配则模拟按对应按键。

上代码结合注释(通过游戏内聊天输入框测试通过):

#coding:utf-8

from ctypes import *

from PIL import ImageGrab, Image

import ctypes

import math

import operator

import time

import win32gui

import win32api

import win32con

import win32com.client

class RECT(ctypes.Structure):

_fields_ = [('left', ctypes.c_int),

('top', ctypes.c_int),

('right', ctypes.c_int),

('bottom', ctypes.c_int)]

def get_image_histogram(imgobj):

return imgobj.histogram()

def pil_image_similarity(h1, h2):

rms = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )

return rms

if __name__=='__main__':

time.sleep(5) #首先休眠5秒,留出时间从cmd窗口切换至游戏窗口

print 'start'

dm = win32com.client.Dispatch('dm.dmsoft' ) #调用大漠插件

h_a = get_image_histogram(Image.open('a.jpg'))

h_d = get_image_histogram(Image.open('d.jpg'))

h_s = get_image_histogram(Image.open('s.jpg'))

HISTS = {'a.jpg': h_a, 'd.jpg': h_d, 's.jpg': h_s}

s = 0 #成功按键计数器

while 1:

try:

rect = RECT()

HWND = win32gui.GetForegroundWindow()#获取当前窗口句柄

ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))#获取当前窗口坐标

coordinate = (rect.left+385, rect.top+400, rect.right-390, rect.bottom-195)#转换为预截图窗口坐标,根据游戏调整

pic = ImageGrab.grab(coordinate)#截图

pic.save('123.jpg')

pic = Image.open('123.jpg') #将截图对象换成Image对象,这样histogram结果才准确

h_pic = get_image_histogram(pic)

#按键提示的原图片和对应键码值

img_list = {'a.jpg': 65, 'd.jpg': 68, 's.jpg': 83}

for img in img_list.keys():

if(pil_image_similarity(HISTS[img], h_pic)

dm.keypress(img_list[img]) #如匹配则调用大漠插件函数按下对应键

if img=='d.jpg':

s += 1 #成功完成连击,计数器++

print '%s ok' % s

break

except:

pass

time.sleep(1) #游戏按键提示持续2-3秒,休眠一秒节省资源

结局:轻看了这款已入末路,bug百出的游戏。它的防外挂可以识别windows消息模拟按键,除聊天框可以模拟输入成功外,其余均失败。

应对方法:第二天使用了大漠插件的硬件模拟,搞定收工。

备注:实际上整个过程都可以用大漠完成,而且还能兼容当前/非当前窗口、多进程等情况。但用自己写的脚本感觉更cool~

最后:使用大漠插件不要忘记注册dm.dll到电脑中。


相关文章

  • 基于RaspberryPi实现的智能家居
  • 摘 要 本文以树莓派为载体进行智能家居控制器的设计.在对现在三种市面上的网络电视的比较中引出毕设的主角--树莓派.首先是LINUX 系统常识性的介绍:然后是在ARM/LINUX平台上面开发应用的两种方法:调用系统已有资源.做程序(C 经典法 ...查看


  • 东方中原电子白板软件操作手册
  • 东方中原互动教学支撑系统 (东方中原电子白板软件) DonviewBoard 用户使用手册 (v1.2) h t t p ://w w w . d o n v i e w a r e . c o m / 目录 第一章 系统特点 ...... ...查看


  • 读书郎P19分析
  • 读书郎P19分析 优点: 触摸屏.触摸板比较灵敏,但触摸板不支持手写功能,机器反应速度较快,屏幕也较清晰,180旋转设置较新颖,输入法识别较快,手写输入一次可识别多个汉字. 缺点: 1.采用标准笔记本电脑键盘,没有中文说明,只有简单英文快捷 ...查看


  • 2016年全国专业技术人员计算机应用能力考试科目模块全真模拟试题答案
  • 全国专业技术人员计算机应用能力考试科目模块全真模拟试题答案 全国专业技术人员计算机应用能力考试全真模拟考试系统(中文windows xp 操作系统) 上机模拟考试试题(第一套) 第一套 1. 请将Windows XP中文版注销. 点击左下角 ...查看


  • 界面设计中生活习惯的作用与关系
  • 摘 要:现代科技越来越发达,新的技术也不断在引进,发展速度之快,已经难以预测.尤其是手机,我依稀记得小时候在电视上看到的大哥大模样,到现在众人垂涎的iPhone,短短数十年,我们这代人鉴证了手机这十几年的发展过程.为了能让更多的用家更好的使 ...查看


  • 电脑入门的基础知识和练习
  • 初 识 电 脑 随着科学技术的不断发展,电脑已被广泛地应用于人类社会的各个领域,目前它已走进了千家万户,逐渐成为人们生活和工作中不可缺少的工具. 1.1.1 什么是电脑 世界上第一台电脑诞生于1946年2月,它是由美国宾夕法尼亚大学研制的, ...查看


  • 电脑入门基础[1
  • 本文由faith0324贡献doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看.第1章学习目标电脑基础入门电脑作为信息社会的标志,掌握电脑操作已成为现代人生存的必备技能之一.本章将 介绍电脑的概念.应用领域. ...查看


  • 信息化教学设计大赛讲解稿
  • MF-47型万用表组装与调试讲解稿 --仿真技术在中职教学中的应用 说到信息技术人们就很容易想到:照相机.收录机.投影.电脑等技术手段.信息化教学设计就是利用图片.音频.视频.网络等技术手段辅助教学.当今社会是信息技术高度发展的时代,我们的 ...查看


  • 苏亚星多媒体教学网V8.1应用方案
  • **图书馆VOD 视频点播系统方案 **学校 多媒体教学系统方案 项目名称:**学校多媒体教学系统方案 制作单位:南京苏亚星资讯科技开发有限公司 编制日期: **图书馆VOD 视频点播系统方案 目 录 一.需求分析 ............ ...查看


热门内容