如何在UWP应用中配置uiAccess以访问其他应用的UI元素
核心原因
UWP应用默认运行在低完整性级别的AppContainer沙箱中,默认无跨进程访问其他应用UI对象的权限。UI Automation访问完整性级别高于当前进程的UI元素时会直接被系统拦截,未配置对应权限、未获得用户授权的情况下,无法提取其他应用尤其是高权限运行应用、系统进程的控件元素。
具体配置方案
1. 配置应用清单声明UI自动化受限能力
打开UWP项目的Package.appxmanifest文件,首先在根<Package>节点添加受限能力的命名空间声明,再在<Capabilities>节点中添加uiAutomation受限能力配置,示例代码如下:
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap"> <!-- 其他清单节点保持默认 --> <Capabilities> <!-- 保留应用默认声明的能力,比如internetClient、generalFile等 --> <rescap:Capability Name="uiAutomation"/> </Capabilities> </Package>
- 本地旁加载部署时,应用首次启动系统会弹出权限申请弹窗,用户点击允许后,即可获得普通权限运行应用的UI元素访问资格。
- 若计划将应用上架微软商店,需要在合作伙伴中心单独提交该受限能力的使用说明,明确告知审核团队使用该能力的场景(如辅助功能工具),审核通过后能力才会对终端用户生效,否则安装后权限会被系统自动屏蔽。
2. 获得高权限进程UI访问资格
仅声明uiAutomation能力无法访问管理员身份运行的应用、系统核心进程的UI元素,需要引导用户完成授权:
- 打开系统「设置-辅助功能」页面,找到对应应用条目,开启“允许应用读取屏幕内容、控制设备”的开关,开启后应用会获得系统级的UI访问权限,可拉取高完整性级别进程的控件树。
3. 适配UIA调用逻辑避免沙箱拦截
- 不要在UWP主线程(STA线程)初始化C++ UIA客户端对象,需要在独立MTA线程中创建
CUIAutomation实例,避免跨进程调用时触发线程模型错误。 - 优先使用客户端侧UIA提供程序模式拉取控件信息,不要依赖服务端注入的UIA模式,否则会被沙箱的跨进程注入规则拦截,导致元素获取失败。
无效方案说明
- 纯UWP应用不支持在manifest中配置
requireAdministrator启动提权项,强行添加该配置会直接导致应用部署失败,该配置仅对桌面桥(Desktop Bridge,即MSIX打包的Win32转制UWP)应用生效。 - 本地调试时用管理员身份启动Visual Studio再部署应用,可临时让调试中的UWP进程获得提权,绕过部分沙箱限制,但该方式仅适用于开发调试,无法用于正式分发场景。
内容的提问来源于stack exchange,提问作者SHOBIT PRASHANT NAIR
相关产品推荐
相关产品推荐

