# 窗口界面控制(预览) # 概述 使用Windows UIAutomation技术触发窗口界面元素。 Quicker目前提供了两个窗口界面控制模块。
![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1625447435644-f25119b2-8cb7-4cff-a424-2a3e823be232.png#averageHue=%23f8f7f6&clientId=u2070dcf7-3869-4&from=paste&height=149&id=ufd6eda40&originHeight=297&originWidth=435&originalType=binary&ratio=1&rotation=0&showTitle=false&size=18529&status=done&style=none&taskId=u01096bef-81c2-4cf0-b5c8-46dc58c5632&title=&width=217.5)
**窗口界面控制:** - 基于.Net自带接口实现。 - 通过控件名称和类型定位控件。有的界面需要较长定位时间,这期间会造成界面卡顿。 - 不支持有多个控件同名的情况。 **窗口界面控制(FlaUI):** - 基于[FlaUI库](https://github.com/FlaUI/FlaUI)实现。 - 提供了通过XPath来定位控件的能力。 本文档包含这两个模块的内容说明。 **注意:** - 由于每个软件实现方式不同,对UIAutomation支持程度不同,此功能只能在一部分软件中、或者软件的一部分界面中使用。具体是否可用,需要您测试判断。 - 即便在可用的软件中,根据窗口状态的不同,也可能无法正常触发。 - 如果有多个步骤,需要在步骤中间增加必要的等待时间,等待界面准备好接受下一步的操作。 - 对于比较复杂的界面,查找控件的时间可能会比较长。 ### 辅助工具 - 可以使用Windows SDK中提供的inspect.exe程序查看界面元素的信息(特别是控件的“名称”)。详见本页面底部的下载链接。 -
# A. 窗口界面控制 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1625447897663-70750f46-dff6-48bf-9ed3-ea76c29acc44.png#averageHue=%23fcfcfb&clientId=u2070dcf7-3869-4&from=paste&height=516&id=udb11b631&originHeight=1031&originWidth=1255&originalType=binary&ratio=1&rotation=0&showTitle=false&size=78541&status=done&style=none&taskId=ud96fc321-91b9-4e0d-a083-592d8df132c&title=&width=627.5) ## 主要参数 【操作类型】选择要执行的操作。可选的操作类型有: - 触发窗口菜单 - 触发窗口控件 - 获取窗口控件信息 - 获取鼠标指针位置控件信息 - 获取焦点控件信息 - 更新“另存为”或“打开”对话框的路径。 【窗口】要操作哪个窗口的控件。不填写表示使用前台窗口;也可以输入窗口句柄数字。 ## 触发窗口菜单 用于触发软件的菜单项。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591425783348-dec7147b-ba68-4c96-84e7-53b64269765a.png#averageHue=%23fbfbfa&height=407&id=DPbIT&originHeight=1282&originWidth=1578&originalType=binary&ratio=1&rotation=0&showTitle=false&size=165311&status=done&style=none&title=&width=501)
上图的设置用于触发下面的菜单。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591426178986-44bf02b0-b8e3-4256-81cb-4291f23c8bbb.png#averageHue=%23e8e6e3&height=254&id=hG1Ud&originHeight=507&originWidth=654&originalType=binary&ratio=1&rotation=0&showTitle=false&size=65174&status=done&style=none&title=&width=327)
**参数**
【菜单路径】需要展开或点击的所有菜单项的名称,每行指定一个。菜单名称需要完全匹配。菜单名称不能存在重复。
【展开延时】上级菜单展开后到下级菜单可用中间需要等待的时间。每个软件可能需要等待的时间不同。 ## 触发窗口控件 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591426768023-24f71cbf-5d18-4ac6-9534-44adef6e4ac4.png#averageHue=%23fafafa&height=430&id=AsVpe&originHeight=1288&originWidth=1578&originalType=binary&ratio=1&rotation=0&showTitle=false&size=164519&status=done&style=none&title=&width=527)
上面的截图用于定位资源管理器里的“选项”按钮。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591427084787-935336c5-46b8-46f2-a0e4-971950338f6b.png#averageHue=%2365af66&height=169&id=TErbK&originHeight=338&originWidth=1933&originalType=binary&ratio=1&rotation=0&showTitle=false&size=87553&status=done&style=none&title=&width=966.5) **参数**
【控件名】
使用inspect.exe 查看到的控件名。如果有重复,会返回查找到的第一个控件。
控件名通常是控件上显示的文字,可能会随按钮状态改变而改变。
可能有多个控件具有相同的名字,但是他们类型不同。这时候可以使用“控件类型”参数进一步筛选。 【控件类型】
要查找控件的类型,用于在有名称相同类型不同的控件时加以区分。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591428152552-b6f7c200-fab3-45d3-85fc-9a5509f946e3.png#averageHue=%23d3ad6f&height=211&id=v8rJH&originHeight=422&originWidth=1266&originalType=binary&ratio=1&rotation=0&showTitle=false&size=87015&status=done&style=none&title=&width=633) 如果希望通过变量动态传递控件类型,需要传入这样的值(类型后面的数字): ```csharp internal enum ControlTypes { Button = 50000, // 0x0000C350 Calendar = 50001, // 0x0000C351 CheckBox = 50002, // 0x0000C352 ComboBox = 50003, // 0x0000C353 Edit = 50004, // 0x0000C354 Hyperlink = 50005, // 0x0000C355 Image = 50006, // 0x0000C356 ListItem = 50007, // 0x0000C357 List = 50008, // 0x0000C358 Menu = 50009, // 0x0000C359 MenuBar = 50010, // 0x0000C35A MenuItem = 50011, // 0x0000C35B ProgressBar = 50012, // 0x0000C35C RadioButton = 50013, // 0x0000C35D ScrollBar = 50014, // 0x0000C35E Slider = 50015, // 0x0000C35F Spinner = 50016, // 0x0000C360 StatusBar = 50017, // 0x0000C361 Tab = 50018, // 0x0000C362 TabItem = 50019, // 0x0000C363 Text = 50020, // 0x0000C364 ToolBar = 50021, // 0x0000C365 ToolTip = 50022, // 0x0000C366 Tree = 50023, // 0x0000C367 TreeItem = 50024, // 0x0000C368 Custom = 50025, // 0x0000C369 Group = 50026, // 0x0000C36A Thumb = 50027, // 0x0000C36B DataGrid = 50028, // 0x0000C36C DataItem = 50029, // 0x0000C36D Document = 50030, // 0x0000C36E SplitButton = 50031, // 0x0000C36F Window = 50032, // 0x0000C370 Pane = 50033, // 0x0000C371 Header = 50034, // 0x0000C372 HeaderItem = 50035, // 0x0000C373 Table = 50036, // 0x0000C374 TitleBar = 50037, // 0x0000C375 Separator = 50038, // 0x0000C376 SemanticZoom = 50039, // 0x0000C377 AppBar = 50040, // 0x0000C378 } ``` 【动作】
找到控件后需要执行的操作。每个控件所支持的操作类型有所不同,您需要进行测试以判断使用哪个操作可以达到目标结果。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591428314100-470d0784-996d-4299-a050-6757a2327be6.png#averageHue=%23f3f2f0&height=328&id=ngr4F&originHeight=656&originWidth=795&originalType=binary&ratio=1&rotation=0&showTitle=false&size=99448&status=done&style=none&title=&width=397.5)
选择“自动”类型,将会依次尝试这些操作,直到其中的一个执行成功:调用、切换选中状态、选择、展开、点击。 ## 获取窗口控件信息 获取指定控件的信息。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591428718346-53351cb4-b2ca-4b7d-bfeb-e1a65fdbc2a0.png#averageHue=%23fafafa&height=486&id=v623G&originHeight=1400&originWidth=1598&originalType=binary&ratio=1&rotation=0&showTitle=false&size=181010&status=done&style=none&title=&width=555)
【位置】输出控件的范围,格式为:Left,Top,Right,Bottom
【值】控件的值或文字等信息。
【控件类型】输出控件类型的名称。此名称不一定和inspect.exe程序中得到的一样😂。
【控件类型ID】表示控件类型的ID数字。 ## 获取鼠标位置的控件信息 获取当前鼠标位置界面元素的信息。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/272392/1591429067955-af2629e5-0ba9-40db-a70b-920aa5167996.png#averageHue=%23fbfbfa&height=365&id=wTefM&originHeight=1040&originWidth=1598&originalType=binary&ratio=1&rotation=0&showTitle=false&size=121098&status=done&style=none&title=&width=561) ## 获得焦点控件信息 获得当前拥有输入焦点的控件信息。 ## 更新“另存为”或“打开”对话框的路径 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1638966959539-09fef15e-2c3c-4776-b4ea-704d8ca68a56.png#averageHue=%23fcfcfc&clientId=uae976ca5-f9ec-4&from=paste&height=304&id=ue114656b&originHeight=608&originWidth=1266&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44770&status=done&style=none&taskId=ua3e2ae54-6d8b-46ee-9497-c81842ece0f&title=&width=633)
用于快速更改保存或打开路径、文件名。
有这些用法: - 路径参数为一个文件夹的完整路径:自动切换到这个文件夹下。 - 路径参数为一个带文件名的完整路径:自动保存或打开对应的文件。 - 路径参数为一个文件名:自动另存或打开这个文件名。 - 在支持打开多个文件的对话框中,可以用 "文件名1" "文件名2" 的格式,选择多个文件。 注:有的软件使用非Windows标准文件对话框可能无法控制。如果您遇到请报告给我们以便于寻找兼容方案。 ## 示例: - 将资源管理器切换为大图标模式:[https://getquicker.net/sharedaction?code=891b5c11-8f82-4dfd-2e10-08d809d218a4](https://getquicker.net/sharedaction?code=891b5c11-8f82-4dfd-2e10-08d809d218a4) - 切换Win10的蓝牙开关:[https://getquicker.net/sharedaction?code=03585a9b-3378-4f4a-2e14-08d809d218a4](https://getquicker.net/sharedaction?code=03585a9b-3378-4f4a-2e14-08d809d218a4) -
# B. 窗口界面控制FlaUI版 ![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1625448377287-ff377c50-869c-4a1a-a38f-1dadfb584cac.png#averageHue=%23fafafa&clientId=u2070dcf7-3869-4&from=paste&height=595&id=u46bac532&originHeight=1190&originWidth=1274&originalType=binary&ratio=1&rotation=0&showTitle=false&size=110281&status=done&style=none&taskId=uf4cd4b0f-89fd-4b82-9aa1-c138d300834&title=&width=637)
基本原理与基础版“窗口界面控制”相同。 ## 参数 【控件XPath或Name】控件相对于窗口的XPath或空间名。使用空间名时将遍历查找控件,会有和基础版“窗口界面控制”相同的限制。
点击右侧的定位按钮,可以从窗口选择控件,获取其XPath。 点击查看视频演示: [点击查看【bilibili】](https://player.bilibili.com/player.html?bvid=BV1S54y1J79d) ## 一些示例场景 更新另存窗口的文件类型:
![]OS7`QC_4DFB`]~U5U~O56O.png](https://cdn.nlark.com/yuque/0/2023/png/272392/1688094457068-f62712b0-5c16-426e-9116-57c4d84a2791.png#averageHue=%23f8f7f5&clientId=u2acbc32f-6048-4&from=paste&height=629&id=u334b9a75&originHeight=944&originWidth=1209&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=117671&status=done&style=none&taskId=u8f911597-03d6-4bd1-ba09-c5029920b46&title=&width=806) # 相关资源 - inspect.exe 程序下载: - x64版本:[https://files.getquicker.net/_sitefiles/_tools/inspect_x64.exe](https://files.getquicker.net/_sitefiles/_tools/inspect_x64.exe) - x86版本:[https://files.getquicker.net/_sitefiles/_tools/inspect_x86.exe](https://files.getquicker.net/_sitefiles/_tools/inspect_x86.exe) - FlaUInspect 程序: - 官网:[https://github.com/FlaUI/FlaUInspect](https://github.com/FlaUI/FlaUInspect) - 下载:[https://files.getquicker.net/_sitefiles/_tools/FlaUInspect_1.3.0.zip](https://files.getquicker.net/_sitefiles/_tools/FlaUInspect_1.3.0.zip) ### 如何通过FlaUInspect获得控件的XPath 启动FlaUInspect时,选择UIA3
![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1627875594292-f0cb2b9b-8ad7-4b04-831b-9b12d98af887.png#averageHue=%23f3f2f1&clientId=u64273fc4-8428-4&from=paste&height=135&id=u0098941a&originHeight=269&originWidth=466&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15539&status=done&style=none&taskId=u5fccf09c-a28a-4119-9aef-3fefb036d5f&title=&width=233)
在Mode菜单中开启HoverMode和ShowXPath
![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1627875621460-3229b4a1-a271-4986-8d3a-696c7be1811b.png#averageHue=%23f3f1f0&clientId=u64273fc4-8428-4&from=paste&height=148&id=ub50963d8&originHeight=296&originWidth=759&originalType=binary&ratio=1&rotation=0&showTitle=false&size=37278&status=done&style=none&taskId=ue98c11c9-79c0-47f3-b55a-45b528d0b22&title=&width=379.5)
然后鼠标移动到某个窗口上时,按ctrl,FlaUInspect会更新当前位置的窗口、控件信息。
![image.png](https://cdn.nlark.com/yuque/0/2021/png/272392/1627875500417-995f9fbe-9d50-4448-97ab-73625b47f4e4.png#averageHue=%23f5f4f2&clientId=u64273fc4-8428-4&from=paste&id=u7d4ee77f&originHeight=633&originWidth=800&originalType=url&ratio=1&rotation=0&showTitle=false&size=231763&status=done&style=none&taskId=uef0c308f-8f0c-430f-9236-41d85296c26&title=)
窗口底部会显示该位置的XPath。
此XPath会包含窗口本身的路径(第一段,如上图的/Window)。Quicker模块中查找XPath时是从窗口本身开始查找,因此需要将此XPath的第一段去除后使用。