梦幻西游自动实现窗口排列分布-6

在之前文章介绍如何启动梦幻西游.时空,可以访问
梦幻西游手游多开一键启动-2

1. 解决问题

每天启动《游戏》时,特别是多开时,需要调节窗口大小和分布位置,比较麻烦和繁琐。

2.解决思路

前提:以按照《梦幻西游手游多开一键启动-2]》中,桌面上设置快捷方式
步骤1:执行脚本时,通过获取句柄,将pycharm程序最小化
步骤2:使用python执行win32api.ShellExecut方法,打开游戏快捷方式
步骤3:缩小窗口
步骤4:移动窗口
步骤5:将步骤1、2、3通过循环方式,依次启动

3.环境配置

Pycharm
airtest
python3.0以上版本

4.正文

4.1最小化pycharm

def minimize_pycham():
    # 根据句柄,最小化
    hwnd_list = []
    win32gui.EnumWindows(lambda hwnd, param: param.append(hwnd), hwnd_list)
    for hwnd in hwnd_list:
        title = win32gui.GetWindowText(hwnd)
        if (title.find("pythonProject")>= 0):#**pythonProject**为pycharm中创建的工程中包含字段,即pycharm的title中包含字段
            print("句柄:", hwnd, "标题:", title)
            win32gui.SendMessage(hwnd, win32con.WM_SYSCOMMAND, win32con.SC_MINIMIZE, 0)
            break

4.1启动API

1)启动沙盒
win32api.ShellExecute(0, 'open', r'C:\Users\Administrator\Desktop\Sandboxie-Plus.lnk','','',1)
2)启动游戏
win32api.ShellExecute(0, 'open', f'C:\\Users\\Administrator\\Desktop\\[1]MyLauncher_x64r.lnk', '','',1) #需要与桌面上快捷方式名称保持一致
print("启动完成")
3)完整启动API
def start_sandboxie():
    '''
    :param games_list: 启动沙盒应用
    :return:
    '''
    # 需要与桌面上快捷方式名称保持一致
    win32api.ShellExecute(0, 'open', f'C:\\Users\\Administrator\\Desktop\\Sandboxie-Plus.lnk', '','',1)
    print("启动完成")
    
def start_game(games_name):
    '''
    :param games_list: 启动应用名称包含字段,如1,2,3
    :return:
    '''
    # 需要与桌面上快捷方式名称保持一致
    win32api.ShellExecute(0, 'open', f'C:\\Users\\Administrator\\Desktop\\[{games_name}]MyLauncher_x64r.lnk', '','',1) 
    print("启动完成")

4.2缩小窗口API

  1. 使用控制鼠标移动的方式,实现缩放
  2. 对应桌面上坐标位置查询,可以使用截图软件和电脑自动的图片编辑软件,查看像素点位
  3. 调用airtest中的swipe方法进行控制缩放
    1)连接电脑
    需导入airtest相关package
from airtest.core.api import *
connect_device(f"Windows:///")

2)截图
截图名称自己定义

pyautogui.screenshot('../img01.png') # 截图

3)查看像素点位
找截图存放位置,选中“”img01.png"图片,右键–编辑–画图,
将鼠标移动至图片任意位置,在画图工具底部会显示当前鼠标的位置,如下图:显示鼠标位置为(648,427)在这里插入图片描述4)缩放操作
如下文:是将(1015, 505)滑动到(310, 10),分6步进行滑动,步数可以自己控制,建议不能太小

swipe((1015, 505), (310, 10), duration=1, steps=6)  # 实现窗口缩放

5)滑动坐标取值
A.启动梦幻西游时空版,每次启动的桌面上显示的位置和窗口大小都是一样。同时只需要缩放宽度,对应窗口自适应缩放。
B.为减少启动过程不小心操作鼠标,因此在swipe前需要点击游戏窗口,我采用直接点击登录控件,确切的说是点击登录控件位置的坐标
C.待游戏启动完成后,将执行截图动作:

	在画图中将鼠标移到登录控件中心,查看当前像素位置,如(xx,yy)
	在画图中将鼠标移到游戏窗口最右边,查看当前像素位置,如(x1,y1)
	手动将窗口缩小(缩放比例自己控制)后,再在截图,在画图中将鼠标移到游戏窗口最右边,查看当前像素位置,如(x2,y2)
	#只需要考虑x坐标变化,y坐标保持一致
swipe((x1, y1), (x2, y1), duration=1, steps=6)  # 实现窗口缩放

6)计算缩小位置计算

A.明确桌面游戏窗口分布情况,是按照2X2,还是2X3排列(2行3列)
B.这里就按照2X3介绍:
a.查看电脑的分辨率是多少,在电脑显示中查看,如1920x1080
b.只需要考虑宽度,1920/3=660,为了好看,两个窗口之间可以预留一些控制,这样控制每个窗口宽度为640
c.在上面介绍获取像素点位,原来差不多:
步骤1:获取最右边点的像素(x1,y1)
步骤2:获取最左边点的像素(x3,y3)
步骤3:用x1-x3得到当前有效窗口宽度L1
步骤4:用L1-640得到需要缩小的值△L
步骤5:用x1-△L得到需要滑动到位置的横坐标x2,纵坐标可取y1
也可以使用x3+640=x2

在这里插入图片描述
7)完整代码

def zoom_game():
    # 缩小窗口,单个
    # 1.连接桌面
    connect_device(f"Windows:///")
    touch((xx,yy)) #点击登录控件
    pyautogui.screenshot('../img01.png') # 截图
    # 2.缩放窗口
    swipe((x1, y1), (x2, y1), duration=1, steps=6)  # 实现窗口缩放

4.3移动窗口API

找到缩放后窗口标题中心位置坐标,当然也可以通过上述x3和x2求平均值得到X。y值就从图片中获取。

在这里插入图片描述1)点击窗口标题,touch((x,y))
2)移动窗口到指定位置

def move_menghua(games_name):
    '''
    :param games_name: 启动应用名称包含字段,如1,2,3
    :return:
    '''
    # 移动窗口(所有的窗口)
    connect_device(f"Windows:///")
    sleep(2)
    #将鼠标移到窗口标题栏中间点坐标,X和Y
    X=188
    Y=200
    touch((X, Y))
    if games_name <=3:#表示第1行只排列3个窗口
        swipe((X,Y),((330+(games_name-1)*660),20), duration=1, steps=6)
    else:
        swipe((X, Y), ((330 + (games_name - 4) * 660), 1080/2), duration=1, steps=6)

5.完整代码

说明:这里就指显示调用的API,不再对每个API单独说明。
# -*- coding: UTF-8 -*-
import pyautogui
import win32api
import win32con
import win32gui
from airtest.core.api import *

def start_all_menghua(game_names):
    '''
    启动所有的game_names列表中所有的应用
    :param game_names: 启动应用名称包含字段,如;[1,2,3]
    :return:
    '''
    #最小化pycharm
    minimize_pycham()
    #启动沙盒
    start_sandboxie()
    sleep(5)

    # 启动手游
    for game_name in game_names:
        start_game(game_name)
        sleep(20) #根据电脑设置等待时长
        # 缩小窗口
        zoom_game()
        # 移动窗口
        move_menghua(game_name)
if __name__ == '__main__':
    # 表示启动5个游戏窗口,根据自己要求缩减game_names列表中的值
    game_names = [1,2,3,4,5] 
    start_all_menghua(game_names)  

6.备注

脚本中部分参数,需要根据自己电脑或游戏窗口设置,请不要盲目复制执行。
若使用中有任何问题,与可沟通。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于Java实现梦幻西游手游自动化功能源码+项目说明.zip 重构了之前写的自动化脚本,目前已经能够实现后台键鼠、图色识别,搭好了脚本的整个运行框架,后续只要在这基础上进行游戏内自动脚本的编写即可,试写了两个简单的功能【自动打图】【自动抓鬼】,测试了一下可以正常运行,需要优化的地方还很多,后续慢慢打磨。 图色识别主要用的是特征匹配算法中的SIFT选取特征点,虽然效率上慢了些,但是特征点的计算比较全,针对此类不需要实时识别游戏(即非FPS)的可以取得不错的效果。 代码注释写得都比较详细,有疑问的地方可以Issue一起交流学习。 项目包结构: -- - pkgAssist 自动化脚本主要程序逻辑 - pkgBean 脚本、游戏数据存储类 - pkgCalc 数值计算辅助类 - pkgDm 大漠插件相关类 - pkgImgSeek 图色识别OpenCV相关类 - pkgTest 测试用例包 测试用例:TestAssist.java -- ```java public class TestAssist { public static void main(String args[]){ //创建Java调用大漠对象 Dm2Java dm = new Dm2Java(); //辅助工具初始化,传入游戏进程句柄,由大漠工具获取 MhxyAssist.AssistInit(328552); //打开游戏全局状态监控 MhxyAssist.GameMonitor(dm); //执行指定脚本任务 // MhxyJob.Job_BaoTu(dm); MhxyJob.Job_Gui(dm); }//main } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值