如何从共享魅力通过协议激活应用程序

本文关键字:协议 激活 应用程序 共享 | 更新日期: 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