【python】UI自动化-uiautomation

article/2025/10/15 4:58:23

UI自动化-uiautomation

    • 0- 前言
    • 1- inspect
    • 2- uiautomation
    • 3- 【实战】RustDesk软件自动 安装、指定服务器信息
    • 4- 参考文章

0- 前言

做应用程序自动点击的记录,暂不完整,仅供参考。参考多位大佬文章,链接在后面

涉及工具

  1. inspect【应用程序元素定位辅助工具; UI SPY 这个软件好像也可以,见别人用过】
  2. uiautomation【本文自动化的重点】
  3. pyautogui【技术不到位,有些元素没法精确定位,用uiautomation获取旁边元素的位置坐标,再用这个模拟键鼠操作】

1- inspect

在这里插入图片描述

# --常用解析--# Name,有些程序有,有些没有
Name:	"学习助手"# ControlType,控件类型,查找窗口的时候 不同控件类型,用不同方法
ControlType:	UIA_WindowControlTypeId (0xC370)# BoundingRectangle,边界矩形,显示这个窗口或按钮、标签、文本框  的 位置信息【左上x坐标,左上y坐标,右下x坐标,右下y坐标】
BoundingRectangle:	{l:88 t:110 r:358 b:309}# 这个 查找窗口的时候 用 
ClassName:	"TkTopLevel"
How found:	Selected from tree...
Name:	"微信"
ControlType:	UIA_WindowControlTypeId (0xC370)
LocalizedControlType:	"窗口"
BoundingRectangle:	{l:-498 t:193 r:642 b:998}
IsEnabled:	true
IsOffscreen:	false
IsKeyboardFocusable:	false
HasKeyboardFocus:	false
AccessKey:	""
ProcessId:	2708
RuntimeId:	[2A.2406AE]
FrameworkId:	"Win32"
ClassName:	"WeChatMainWndForPC"
NativeWindowHandle:	0x2406AE
IsControlElement:	true
ProviderDescription:	"[pid:2400,providerId:0x2406AE Main:Nested [pid:2708,providerId:0x2406AE Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (IAccessible2) (unmanaged:uiautomationcore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
AriaProperties:	""
IsPassword:	false
IsRequiredForForm:	false
IsDataValidForForm:	true
HelpText:	""
Culture:	0
IsDialog:	false
LegacyIAccessible.ChildId:	0
LegacyIAccessible.DefaultAction:	""
LegacyIAccessible.Description:	""
LegacyIAccessible.Help:	""
LegacyIAccessible.KeyboardShortcut:	""
LegacyIAccessible.Name:	"微信"
LegacyIAccessible.Role:	客户端 (0xA)
LegacyIAccessible.State:	正常 (0x0)
LegacyIAccessible.Value:	""
Transform.CanMove:	true
Transform.CanResize:	true
Transform.CanRotate:	false
Window.CanMaximize:	true
Window.CanMinimize:	true
Window.IsModal:	false
Window.IsTopmost:	false
Window.WindowInteractionState:	ReadyForUserInteraction (2)
Window.WindowVisualState:	Normal (0)
IsAnnotationPatternAvailable:	false
IsDragPatternAvailable:	false
IsDockPatternAvailable:	false
IsDropTargetPatternAvailable:	false
IsExpandCollapsePatternAvailable:	false
IsGridItemPatternAvailable:	false
IsGridPatternAvailable:	false
IsInvokePatternAvailable:	false
IsItemContainerPatternAvailable:	false
IsLegacyIAccessiblePatternAvailable:	true
IsMultipleViewPatternAvailable:	false
IsObjectModelPatternAvailable:	false
IsRangeValuePatternAvailable:	false
IsScrollItemPatternAvailable:	true
IsScrollPatternAvailable:	false
IsSelectionItemPatternAvailable:	false
IsSelectionPatternAvailable:	false
IsSpreadsheetItemPatternAvailable:	false
IsSpreadsheetPatternAvailable:	false
IsStylesPatternAvailable:	false
IsSynchronizedInputPatternAvailable:	false
IsTableItemPatternAvailable:	false
IsTablePatternAvailable:	false
IsTextChildPatternAvailable:	false
IsTextEditPatternAvailable:	false
IsTextPatternAvailable:	false
IsTextPattern2Available:	false
IsTogglePatternAvailable:	false
IsTransformPatternAvailable:	true
IsTransform2PatternAvailable:	false
IsValuePatternAvailable:	false
IsVirtualizedItemPatternAvailable:	false
IsWindowPatternAvailable:	true
IsCustomNavigationPatternAvailable:	false
IsSelectionPattern2Available:	false
FirstChild:	"" 窗格
LastChild:	"" 窗格
Next:	"【python】UI自动化-uiautomation.md• - Typora" 窗口
Previous:	"Home - 360极速浏览器X 21.0" 窗口
Other Props:	Object has no additional properties
Children:	"" 窗格"" 窗格
Ancestors:	"桌面 1" 窗格[ No Parent ]

2- uiautomation

一、uiautomation方法

方法备注
WindowContrl(searchDepth,ClassName,SubName)查找窗口中的程序,如果有中文则需用Unicode
window.Exists(maxSearchSeconds)来判断此窗口是否存在
EditControl(searchFromControl)查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值
Win32API.SendKeys(“string”)如果已在编辑位置,则可用此方法来输入值,{Ctrl}为ctrl键,其他类似;{@8}格式可输入8个@,对于数字也可实现此功能,但对于字母不能…;
MenuItemControl(searchFromControl,Name)查找菜单按钮
ComboBoxControl(searchFromControl,AutomationI)查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项
import uiautomation
import subprocess# 查找窗口中的程序,如果有中文则需用Unicode;可用
uiautomation.WindowContrl(searchDepth,ClassName,SubName) # 来判断此窗口是否存在
uiautomation.window.Exists(maxSearchSeconds)# 查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值
uiautomation.EditControl(searchFromControl) # 查找菜单按钮
uiautomation.MenuItemControl(searchFromControl,Name) #  查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项
uiautomation.ComboBoxControl(searchFromControl,AutomationI)# 查找按钮
uiautomation.BottonControl(searchFromControl,Name,SubName) 
# Uiautomation元素获取方法如下程序窗口:uiautomation.WindowControl
按钮:uiautomation.ButtonControl
文本:uiautomation.TextControl
输入窗口:uiautomation.EditControl
文档控件:uiautomation.DocumentControl
单选控件:uiautomation.CheckBoxControl
复选控件:uiautomation.ComboBoxControl
日历控件:uiautomation.CalendarControl'''
ControlType为”ControlType.Window”
那么捕获窗口就用:uiautomation.WindowControl如果ControlType为”ControlType.Text”
那么捕获窗口就用:uiautomation.TextControl依次类推...
如果ControlType为”ControlType.Xxx”
那么捕获窗口就用:uiautomation.XxxControl如果类型不明确,则使用uiautomation.Control
'''
# 常用的操作有
DoubleClick()双击
Click()单击
RightClick()右键点击
SendKeys()发送字符
SetValue()传值
# 三、对windows程序常用操作subprocess.Popen(‘Name’)   用进程打开程序;window.Close()         关闭窗口;window.SetActive()     使用;window.SetTopMost()     设置为顶层window.ShowWindow(uiautomation.ShowWindow.Maximize) 窗口最大化window.CaptureToImage(‘Notepad.png’) 截图;

3- 【实战】RustDesk软件自动 安装、指定服务器信息

下面代码引入的文件 的内容

192.168.1.78
vEJU4Fasd/asdadagsdaasdgadfasdasfasfaasffffffddddddddddddddda6W8=
rustdesk-1.1.9-putes.exe---读取顺序---
---第1行 服务器ip---
---第2行 KEY---
---第3行 rustdesk安装包名字[要带拓展名]---功能:自动安装rustdesk客户端,安装后开启"允许IP直接访问",执行期间不要使用键盘鼠标
# -*- coding: utf-8 -*-
# @Time : 2022/11/18 9:06
# @File : UI自动化.py
# @Software: PyCharmimport time
import uiautomation as auto
import subprocessimport pyautogui
import pyperclip
import osf = open('key.txt', mode='r', encoding='utf-8')
key_list = f.read().split('\n')
f.close()# 打开软件
subprocess.Popen(key_list[2])
auto.uiautomation.SetGlobalSearchTimeout(5)  # 设置全局搜索超时 5# 获取
print('----开始安装--请勿操作键盘鼠标----')
win_0 = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')
win_0.ButtonControl(Name='同意并安装').Click()
# time.sleep(int(key_list[2]))
time.sleep(10)
for i in range(1, 20):print(f'{i}')if os.access(r'C:\Users\Public\Desktop\RustDesk.lnk', os.X_OK):time.sleep(5)try:win_0 = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')win_0.ButtonControl(Name='关闭').Click()time.sleep(3)except:passbreakelse:time.sleep(1)# -------执行-----
print('打开软件')
subprocess.Popen(r"C:\Program Files\RustDesk\RustDesk.exe")
# os.system(r'start C:\"Program Files"\RustDesk\RustDesk.exe')
auto.uiautomation.SetGlobalSearchTimeout(5)  # 设置全局搜索超时 5# 获取
win = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')
print(win.BoundingRectangle)# 点击最大化
# win.ButtonControl(Name="最大化").Click()# 控制的应用窗口前置
win.SetTopmost(True)# 获取 三个点 位置
button = win.TextControl(Name='你的桌面可以通过下面的ID和密码访问。')
# print(button.BoundingRectangle)# ---把三个点的位置转换成列表,并点击---
a = str(button.BoundingRectangle)a = list(map(int, a[1:a.find(')')].split(',')))  # 把列表中的字符串转成整型print(a)# x,y 为 单击坐标,button 为 鼠标左或右键点击('left' / 'right')
pyautogui.click(a[2], a[3] + 20, button='left')
time.sleep(1)
# ---把三个点的位置转换成列表,并点击---END---# 设置
win.TextControl(Name='允许IP直接访问').Click()pyautogui.click(a[2], a[3] + 20, button='left')
time.sleep(1)
win.TextControl(Name='ID/中继服务器').Click()
time.sleep(1)# pyautogui.hotkey('ctrl', 'a')  # 按下 ctrl + c 组合键。此次测试不生效
# ---------
def key_cv(c, v):""" 模拟执行快捷键 """pyautogui.keyDown(c)pyautogui.keyDown(v)pyautogui.keyUp(v)pyautogui.keyUp(c)key_cv('ctrl', 'a')pyperclip.copy(key_list[0])  # 复制
pyperclip.paste()  # 粘贴key_cv('ctrl', 'v')# ---------time.sleep(0.5)
pyautogui.press('Tab')
pyautogui.press('Tab')
pyautogui.press('Tab')# ---------
key_cv('ctrl', 'a')pyperclip.copy(key_list[1])  # 复制
pyperclip.paste()  # 粘贴key_cv('ctrl', 'v')time.sleep(1)
pyautogui.press('tab')
pyautogui.press('tab')
time.sleep(0.5)
pyautogui.press('enter')time.sleep(1)win.ButtonControl(Name='关闭').Click()
print('--------执行结束--------')
time.sleep(5)

4- 参考文章

# inspect
https://blog.csdn.net/knighthood2001/article/details/124297008# uiautomation
https://blog.csdn.net/yangzhichao_csdn/article/details/124799781
https://blog.csdn.net/chenmozhe22/article/details/106926071
https://blog.csdn.net/qq_21142893/article/details/84874406# PyautoGui
https://blog.csdn.net/weixin_38640052/article/details/112387653

http://chatgpt.dhexx.cn/article/ufZ94c0Z.shtml

相关文章

CAD 双击实体事件

CAD本身为我们提供的双击事件的设置。工具-工作空间-自定义...打开用户自定界面 窗体内找到双击动作。在双击动作下我们可以看到CAD自带的所有实体 例如我们在双击三维实体时自定义一个事件。那么我们就选中三维实体-快捷特性。在右侧特性里编辑宏内容。以下是系统彼带的宏$M$(…

深入探索透视投影变换(续)

-潘宏 -2009.4.14 -本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教 -email: popyynetease.com -B站专栏: https://b23.tv/oWsl6PD 在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视…

凯文·凯利:AI将改变一切设计工作

每一项新技术诞生之初都会引发新一轮科技恐慌周期,近期大火的AI生成艺术更是如此。连线杂志创始主编、知名科技思想家凯文凯利(Kevin Kelly)在6个月重度使用之后认为,这次AI进展的确是一次令人震惊的突破。但是,它不会…

鼠标双击退出应用程序简单实现

文章目录 Android 简单模拟鼠标双击退出应用程序,利用Toast提示“再点一次退出”使用Toast鼠标单击提示信息鼠标双击实现退出系统 Android 简单模拟鼠标双击退出应用程序,利用Toast提示“再点一次退出” 使用Toast // 参数:当前上下文环境&…

如何用JavaScript完美地区分双击和单击事件

通过一个悬浮球交互功能的案例来阐述问题,以及解决办法。 实现效果 类似微信里的悬浮窗效果,苹果手机的悬浮球功能效果 1.可以点击拖动,然后吸附在窗口边缘2.点击悬浮球,可以跳转界面,或者更改悬浮球的形态准备 1.移…

单机显示、双击隐藏;事件绑定、单击div、双击div、删除事件;元素显示、隐藏、交替; 向上收缩、向下展开、交替;淡入淡出

单机显示、双击隐藏 <style>div {width: 500px;height: 200px;background-color: green;display: none;} </style> <body><button id"btn">单击显示&#xff0c;双击隐藏</button><br><br><div> </div&…

干货分享 | UE游戏鼠标双击判定

UE虚幻引擎对于游戏开发者来说都不陌生&#xff0c;市面上有47%主机游戏使用虚幻引擎开发游戏。作为是一款游戏的核心动力&#xff0c;它的功能十分完善&#xff0c;囊括了场景制作、灯光渲染、动作镜头、粒子特效、材质蓝图等。本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判…

鼠标单击变双击问题

解决此问题可以从硬件和软件两方面思考角度入手:我们先把鼠标插在别人的机器上使用,如果没发现问题可能是软件问题,若发现同样的问题则可能是硬件方面的问题。 软件方面:(1)病毒导致将杀毒软件病毒库更新至最新版,全盘扫描。 (2)鼠标属性设置不当我们打开控制面板-&…

鼠标双击事件

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) java中没有给出鼠标双击事件&#xff0c;虽然可以通过事件源e.getClickCount()2来判断鼠标点击次数&#xff0c;但是执行双击事件的同时也执行了单击事件&#x…

关于双击与单击事件冲突解决方案

有时候会要需求要求&#xff0c;比如附件&#xff0c;单击查看详情&#xff0c;双击下载文件时遇到的双击单击事件同时绑定一个节点。 比如单击click&#xff0c;dlbclick同时绑定时&#xff0c;双击会同时触发&#xff0c;而且click会触发两次。单用click来处理双击单击同时存…

TRUE PARTNER迎来戴维斯双击,资产规模业绩双增长

配图来自Canva可画 2020年可谓是黑天鹅乱舞的一年&#xff0c;新冠疫情肆虐全球&#xff1b;原油危机引发的资本市场动荡&#xff1b;地缘政治冲突以及美国大选&#xff0c;市场处于时不时来一波的上蹿下跳的状态当中。 在资本市场波动加剧的大环境中&#xff0c;有这样一家奇…

慧择业务布局成效明显,戴维斯双击可期

“没有一个冬天不会过去&#xff0c;没有一个春天不会到来”。 过去的一年&#xff0c;美股市场波折不断&#xff0c;尤其是2020年3月份的4次熔断&#xff0c;让股神巴菲特都惊呼“活久见”。 过去的一年&#xff0c;美股市场惊喜不断&#xff0c;道琼斯指数更是在2020年11月创…

流动性持续改善,佳源国际迎来“戴维斯双击”?

随着上半年密集的救市政策出台&#xff0c;房地产行业迎来触底回暖。 5月&#xff0c;央行以不低于市场报价利率20个基点调整首套房贷款利率下限&#xff0c;这也让当前金融环境在近几年处于较为宽松的阶段。 据克而瑞研究中心观点&#xff0c;因冲刺年中业绩&#xff0c;房企…

湖人詹姆斯 戴维斯 拉塞尔三人合体就赢!

湖人主力詹姆斯&#xff08;LeBron James&#xff09;球星成为NBA新历史得分王后&#xff0c;连3战因伤缺席&#xff0c;今天主场对抗鹈鹕终于回归&#xff0c;和戴维斯&#xff08;Anthony Davis&#xff09;、拉塞尔&#xff08;DAngelo Russell&#xff09;三人连线&#xf…

九龙证券|游戏板块或继续迎来业绩估值“戴维斯双击”

机构指出&#xff0c;AIGC技术及产品现在已在游戏职业有部分使用&#xff0c;中长期来看&#xff0c;对游戏制作的降本增效、内容质量进步有较强的促进作用&#xff1b;当前游戏版号常态化发放&#xff0c;政策端不确定性降低&#xff0c;预计产品周期是成绩的要害驱动&#xf…

戴维斯双击背后的故事 - 读《戴维斯王朝》

一、序言 作为一个对炒股知识孤陋寡闻的新手&#xff0c;我最近才听说「戴维斯双击」&#xff0c;于是买了《戴维斯王朝》了解了一下戴维斯本人以及他的成功故事。看完书后&#xff0c;我感觉戴维斯本人还真算是一段传奇经历。 戴维斯的投资回报率和巴菲特对等&#xff0c;他投…

科普一下,什么是戴维斯双击和戴维斯双杀?

创业板受到多重利空压制而大跌&#xff0c;上证也受到拖累&#xff0c;只有上证50小幅翻红。创业板依然是下跌趋势&#xff0c;不要瞎猜底部&#xff0c;更不要轻易抄底&#xff0c;要以均线为准&#xff0c;反弹站上5日线才有短线机会。主板部分板块仍然是处于上升趋势&#x…

股票策略 —— 戴维斯双击

1、策略概述 这里的戴维斯是美国的一个投资大师&#xff0c;38 岁才开始投资生涯&#xff0c;初始资金 5 万美元&#xff0c;最终财富达到 9 亿美元&#xff0c;并登上福布斯400 富豪榜。他投资策略中的选股的要点是良好的管理、持续增长及低估值。 后来基于这两个原则&#x…

戴维斯双击策略的实现与验证

戴维斯双击策略的实现与验证 戴维斯效应简述&#xff1a; 戴维斯双击和戴维斯双杀&#xff1a; 戴维斯效应&#xff0c;就是有关市场预期与上市公司价格波动之间的双倍数效应。也就是说当一个公司利润持续增长使得每股收益提高&#xff0c;同时市场给予的估值也提高&#xf…

如何在Github上建立自己的个人博客网站详细教程

概述 之前闲着没事,就利用Github建了一个个人博客网站,效果还不错,今天就来分享一下. 建立自己个人博客网站的好处: 1.面试装逼,这个不必多说… 2.把平时积累的知识和项目记录下来,方便日后查看使用 3.不受其他博客平台的限制 准备工作 开始之前,先大致介绍一下用到的技术和…