一、准备工作
pip install pywin32==228
下载应用程序spy++
二、拉起要登陆的应用
import os
import win32api
import win32con
import win32gui
import time
def open_exe(vpnPath):
win32api.ShellExecute(0, 'open', vpnPath, '','',1) # 拉起登录窗口
time.sleep(3)
open_exe('xx\FortiSSLVPNclient.exe')
三、打开spy++,获取句柄
拖动spy++左上角的指针,放到要登录的应用窗口上
得到窗口句柄和标题文本,通过它们获取到应用的句柄
loginHandle = win32gui.FindWindow('#32770', 'FortiClient SSLVPN') # 获取句柄
hwndChildList = []
# 遍历获取子句柄
win32gui.EnumChildWindows(loginHandle, lambda x, y: y.append(x), hwndChildList)
print(hwndChildList)
所有子句柄列表
四、获取子句柄,进行应用登录
按照上面获取主窗口句柄的方法,将spy++的指针放在要填写数据的地方,获取子句柄,查找该子句柄在上面所有子句柄列表中的索引位置
def find_window_login(serverAddress, username, password):
loginHandle = win32gui.FindWindow('#32770', 'FortiClient SSLVPN') # 获取句柄
hwndChildList = []
# 遍历,win32gui获取应用所有子句柄
win32gui.EnumChildWindows(loginHandle, lambda x, y: y.append(x), hwndChildList)
# 按照索引位置取到子句柄
serverAddressHandle = hwndChildList[4]
usernameHandle = hwndChildList[6]
passwordHandle = hwndChildList[8]
connectBtnHandle = hwndChildList[27]
win32gui.SendMessage(serverAddressHandle, win32con.WM_SETTEXT, None, serverAddress)
win32gui.SendMessage(usernameHandle, win32con.WM_SETTEXT, None, username)
win32gui.SendMessage(passwordHandle, win32con.WM_SETTEXT, None, password)
win32gui.SendMessage(connectBtnHandle, win32con.WM_LBUTTONDOWN, None, None)
win32gui.SendMessage(connectBtnHandle, win32con.WM_LBUTTONUP, None, None)
find_window_login('xxxx', 'xxx', 'xxx')
登录成功