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

时间:2013-02-13 20:57:48

标签: c# xaml windows-8 windows-store-apps

我正在尝试从自己的共享合同中激活我的应用程序(请 - 从评论的角度来看,不要评论是否可以这样做...应用程序激活是通过一个按钮完成的分享合同用户界面,除非用户主动,否则不会发生。我在这里询问技术问题,而不是用户体验方面的问题 - 谢谢!)

我设置它的方式是这样的:

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)

我可以做些什么来完成这项工作?有什么想法吗?

出现此问题的callstack就是这个(没有用户代码,不会被UnhandledException事件处理)...

  

mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.ThrowAsyncIfNecessary.AnonymousMethod__1(object s)+ 0x33 bytes     mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态)+ 0x3e字节     mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx)+ 0xa7 bytes     mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx)+ 0x16 bytes     mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+ 0x60 bytes     mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()+ 0x149 bytes     mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()+ 0x5 bytes     [原生于管理过渡]

2 个答案:

答案 0 :(得分:2)

解决方案相当简单,如果有些老派(尽管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不会混淆和抱怨应用程序关闭和打开同时。

答案 1 :(得分:0)

你不能。

不幸的是,你正在尝试混合那些并非混合的东西。如果您为应用程序创建自定义协议激活,则调用包含该协议的uri将启动您的应用程序。共享魅力只会激活具有共享目标合同的应用程序。没有例外。

以下是有关协议激活的更多信息。您可能会发现它很有用:http://blog.jerrynixon.com/2012/10/walkthrough-using-windows-8-custom.html