如何诊断通过编程方式打开截图工具时的重定向失效问题?
看起来你遇到的是调用系统截图工具(通过ms-screenclip协议)后,无法正常重定向回UWP应用的问题——明明直接在浏览器里打开自定义协议myapp://app能正常触发App.OnActivated,咱们一步步来排查可能的原因:
先检查重定向URI的编码是否规范
你当前的代码里直接把responseUri拼到了最终的URI里,但按照ms-screenclip协议的要求,redirect-uri参数的值需要做URI编码处理。哪怕你的myapp://app看起来没有特殊字符,也得符合规范。修改后的代码可以改成这样:var package = Windows.ApplicationModel.Package.Current; var responseUri = "myapp://app"; var options = $"user-agent={Uri.EscapeDataString(package.Id.FamilyName)}&auto-save=true&rectangle&enabledModes=All"; var encodedResponseUri = Uri.EscapeDataString(responseUri); var uri = $"ms-screenclip://capture/image?{options}&redirect-uri={encodedResponseUri}"; await Launcher.LaunchUriAsync(new Uri(uri));你可以先把编码后的完整URI复制到浏览器里打开,测试能不能触发应用激活,验证编码是否正确。
确认截图工具的协议参数是否兼容
不同版本的Windows对ms-screenclip的参数支持可能有差异:- 试试把
enabledModes=All换成具体的模式值,比如enabledModes=Rectangular或者enabledModes=Freeform,有些旧版本系统可能不支持All这个取值。 - 另外
rectangle是开关型参数,你的写法没问题,但可以暂时去掉这个参数,看是否会影响重定向功能。
- 试试把
再次核对UWP应用的协议注册配置
虽然浏览器能正常唤起应用,但还是要确认Package.appxmanifest里的协议注册是否完整,比如:<Extensions> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="myapp"> <uap:DisplayName>我的应用协议</uap:DisplayName> </uap:Protocol> </uap:Extension> </Extensions>注意协议名称
Name="myapp"要和你用的myapp://app完全一致,大小写是敏感的。测试不同场景下的重定向是否正常
可以做个简单的测试:创建一个HTML页面,里面放一个指向你构造的ms-screenclipURI的链接,点击链接打开截图工具,完成截图后看是否能重定向回应用。如果这个场景也不行,说明可能是系统层面的问题;如果这个场景正常,那问题大概率出在你的UWP应用调用Launcher.LaunchUriAsync的逻辑上。检查应用激活的处理逻辑
截图工具重定向回来时,激活参数的类型是ProtocolActivatedEventArgs,你需要在App.OnActivated里明确判断并处理:protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { var protocolArgs = args as ProtocolActivatedEventArgs; var redirectedUri = protocolArgs.Uri; // 这里可以加日志或者断点,确认是否收到了重定向请求 // 处理截图相关的参数逻辑 } // 别忘了初始化应用的其他必要逻辑 Frame rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } rootFrame.Navigate(typeof(MainPage)); Window.Current.Activate(); }有时候不是重定向没过来,而是你的激活逻辑没正确捕获到请求。
确认系统版本的兼容性
ms-screenclip协议是Windows 10 1809版本及以上才引入的,如果你的测试系统版本低于这个,可能部分功能(包括重定向)不支持,先确认目标系统版本是否符合要求。
备注:内容来源于stack exchange,提问作者Serge Misnik

