在之前文章介绍如何启动梦幻西游.时空,可以访问
梦幻西游手游多开一键启动-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
- 使用控制鼠标移动的方式,实现缩放
- 对应桌面上坐标位置查询,可以使用截图软件和电脑自动的图片编辑软件,查看像素点位
- 调用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.备注
脚本中部分参数,需要根据自己电脑或游戏窗口设置,请不要盲目复制执行。
若使用中有任何问题,与可沟通。