当前位置:   article > 正文

Windows自动化之UIautomation(一)_uiautomation 无name

uiautomation 无name

一、UIAutomation的工作原理:

UIAutomation操作程序时会给程序发送WM_GETOBJECT消息,如果程序处理WM_GETOBJECT消息,实现UI Automation Provider,并调用函数
UiaReturnRawElementProvider(HWND hwnd,WPARAM wparam,LPARAM lparam,IRawElementProviderSimple *el),此程序就支持UIAutomation。

IRawElementProviderSimple 就是 UI Automation Provider,包含了控件的各种信息,如Name,ClassName,ContorlType,坐标等。

UIAutomation 根据程序返回的 IRawElementProviderSimple,就能遍历程序的控件,得到控件各种属性,进行自动化操作。若程序没有处理WM_GETOBJECT或没有实现UIAutomation Provider,UIAutomation则无法识别这些程序内的控件,不支持自动化。
很多DirectUI程序没有实现UIAutomation Provider,所以不支持自动化。

关于各控件所支持的控件模式,可参考:
https://docs.microsoft.com/zh-cn/windows/win32/winauto/uiauto-controlpatternmapping

二、安装

pip install uiautomation
  • 1

三、使用

①获取窗口

import uiautomation as auto
# 前提是打开记事本-打开操作不在这里叙述
window_name = auto.WindowControl(searchDepth=1, ClassName="Notepad")  # 获取窗口
# 设置窗口前置
window_name.SetTopmost(True)
print(window_name.Name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

控件可用参数说明
searchFromControl = None:从哪个控件开始查找,如果为None,从根控件Desktop开始查找
searchDepth = 0xFFFFFFFF: 搜索深度
searchInterval = SEARCH_INTERVAL:搜索间隔
foundIndex = 1 :搜索到的满足搜索条件的控件索引,索引从1开始
Name:控件名字
SubName :控件部分名字
RegexName:使用re.match匹配符合正则表达式的名字,Name,SubName,RegexName只能使用一个,不能同时使用
ClassName :类名字
AutomationId: 控件AutomationId
AutomationIdControlType :控件类型
Depth:控件相对于searchFromControl的精确深度
Compare:自定义比较函数function(control: Control, depth: int)->bool
为了进一步操作该程序,我们可以使用inspect.exe工具分析控件结构

②UIAutomation的常见功能
显示桌面(相当于点击桌面右下角的按钮):

auto.ShowDesktop()
  • 1

获取uiautomation已运行的时间:

auto.ProcessTime()
  • 1

判断两个控件是否一致:

auto.ControlsAreSame(control1, control2)
  • 1

鼠标点击指定坐标:

auto.Click(x, y)
  • 1

右键单击:

auto.RightClick(x, y)
  • 1

鼠标拖拽(鼠标从(x1,y1)位置按下鼠标拖动到(x2,y2)位置):

auto.DragDrop(x1, y1, x2, y2, moveSpeed=1)    # moveSpeed参数决定了移动的速度。
  • 1

隐藏窗口:

win.Hide(0)
  • 1

显示窗口:

win.Show(0)
  • 1

窗口最小化:

win.Minimize()
  • 1

窗口最大化:

win.Maximize()
  • 1

判断窗口是否已经被最小化:

auto.IsIconic(win.NativeWindowHandle)   # IsIconic进支持传入本地窗口句柄。
  • 1

管理员提权

# 将原本存在于__main__代码块中的内容存放于main()方法中即可
if __name__ =='__main__':
	if auto.IsUserAnAdmin():
        main()
    else:
    	print('RunScriptAsAdmin', sys.executable, sys.argv)
        auto.RunScriptAsAdmin(sys.argv)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/476391
推荐阅读
相关标签
  

闽ICP备14008679号