1.场景:每天开机后都需要点开qq,pl/sql,idea,chrome等应用,觉得很麻烦,于是想到用python做一个程序,实现自动登录这些应用。
2.原理:就是实现 打开应用–等待窗口–点击按钮 这一流程,这边选择使用os+win32模块。本来想获取窗口句柄,然后获取按钮(子控件)的方式来实现点击的,但是发现个别应用只能获取到窗口句柄(spy++查看),无法遍历获取到子控件,所以统一使用像素座标定位按钮,然后模拟鼠标移动和点击。所幸电脑分辨率1920*1080就是默认像素尺寸,并且以上应用打开后的位置固定(不固定也可以通过获取窗口句柄然后移动窗口来固定),所以按钮的像素座标很好获取。
qq登录按钮位置,pl/sql取消按钮位置,idea第一个工程的位置:
3.代码
import os
import time
import win32gui
import win32api
import win32con
# 设置appdict
pyexe = "E:\...\python.exe"
appdict = {'qq': '"D:\...\QQScLauncher.exe"',
'pl/sql': '"E:\...\plsqldev.exe"',
'idea': '"E:...\idea64.exe"',
'chrome': '"C:\...\chrome.exe"'}
# qq登录按钮位置,pl/sql取消按钮位置,idea第一个工程的位置
coorddict = {'qq': [960, 665], 'pl/sql': [1060, 620], 'idea': [700, 245]}
namedict = {'qq': 'QQ', 'pl/sql': 'Oracle Logon', 'idea': 'Welcome to IntelliJ IDEA'}
# 打开应用并且鼠标点击按钮(获取按钮的像素座标很麻烦)
def open_by_grab():
pyhd = win32gui.FindWindow(None, pyexe) # 360会拦截pyexe,可以添加信任或者关闭360
# 设置pyexe窗口属性和位置,太大会挡住一些窗口
win32gui.SetWindowPos(pyhd, win32con.HWND_TOPMOST, 0, 0, 500, 500, win32con.SWP_SHOWWINDOW)
print("py exe 句柄: %s ..." % pyhd)
for key in appdict.keys():
print("启动 %s ..." % key)
os.popen(r'%s' % appdict[key]) # os.system会阻塞
time.sleep(3)
if key == "chrome":
pass
else:
winhd = win32gui.FindWindow(None, namedict[key]) # 根据窗口名获取句柄
while winhd == 0:
print("等待获取%s窗口 ..." % key)
time.sleep(3)
winhd = win32gui.FindWindow(None, namedict[key])
print("获取%s窗口成功,开始登录 ..." % key)
a, b = coorddict[key]
mouse_click(a, b)
time.sleep(3)
print("完毕 ...")
time.sleep(1)
win32gui.SendMessage(pyhd, win32con.WM_CLOSE)
# 模拟鼠标点击
def mouse_click(a, b):
time.sleep(1)
win32api.SetCursorPos((a, b))
time.sleep(1)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # 360会拦截虚拟按键,可以添加信任或者关闭360
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
open_by_grab()
4.使用bat调用py(没有py环境可以打包做成exe)
新建一个文本,增加调用py的命令,然后改成bat后缀:
start python "E:\...\openapp.py"
注意要在安全卫士添加信任,不然会拦截,很烦。
其他应用可以自行添加,也可以增加一些后续操作,或者对于pl/sql用获取句柄方式自动填用户密码然后点击确认登录…等等。
现在每天开机后点一下start.bat就可以玩手机了,美滋滋。