如何从共享魅力通过协议激活应用程序
本文关键字:协议 激活 应用程序 共享 | 更新日期: 2023-09-27 17:59:06
我正试图从自己的共享合同激活我的应用程序(请不要评论从认证的角度来看这是否可以……应用程序激活是通过共享合同UI上的按钮完成的,除非用户主动激活,否则不会激活。我在这里问的是技术问题,而不是用户体验方面的问题——谢谢!)
我的设置方式是这样的:
this.m_shareOperation.ReportStarted();
// ....
this.m_shareOperation.ReportCompleted();
await Launcher.LaunchUriAsync(new Uri("se-myapp:///something"));
一切似乎都很好-激活事件/覆盖触发,应用程序实际上激活并显示,但在我的OnActivated代码完成后,显示以下错误:
The operation cannot be completed because the window is being closed. (Exception from HRESULT: 0x802A0201)
我该怎么做才能让它发挥作用?知道吗?
出现此消息的调用堆栈是this(没有用户代码,不由UnhandledException事件处理)。。。
mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.SthrowAsyncIfNenecessary。匿名方法__1(对象s)+0x33字节mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WetCallback_Context(对象状态)+0x3e字节mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext ExecutionContext,System.Threading.Context回调,对象状态,bool preserveSyncCtx)+0xa7字节mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.Context回调,对象状态,bool preserveSyncCtx)+0x16字节mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.ThreadPoolWorkItem.ExecuteWorkItem()+0x60字节mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()+0x149字节mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()+0x5字节[本机到托管的过渡]
解决方案相当简单,虽然有点老派(尽管WinRT完全支持)。。。
步骤0:定义要在应用程序中使用的命名事件:
public static EventWaitHandle GetActivationEvent()
{
EventWaitHandle sync = new EventWaitHandle(false, EventResetMode.ManualReset, Constants.ActivationEventName);
return sync;
}
步骤1:在OnActivate()覆盖中,获取该事件并设置它:
using (var sync = Utils.GetActivationEvent())
{
sync.Set();
}
第2步:从共享目标,以以下方式激活自己:
using (EventWaitHandle sync = Utils.GetActivationEvent())
{
await Launcher.LaunchUriAsync(new Uri(String.Format("my-protocol:///?id={0}&operation={1}", id, op)));
await Task.Run(() => sync.WaitOne(5000));
this.m_shareOperation.ReportCompleted();
}
就是这样。这将确保Windows不会对应用程序同时关闭和打开感到困惑和抱怨。
你不能。
不幸的是,你试图把不该混合的东西混合在一起。如果您为应用程序创建自定义协议激活,则调用包含该协议的uri将启动应用程序。共享魅力只会激活具有共享目标合约的应用程序。没有例外。
以下是有关协议激活的更多信息。您可能会发现它很有用:http://blog.jerrynixon.com/2012/10/walkthrough-using-windows-8-custom.html