1

我正在尝试从其自己的股票合同激活我的应用程序(请 - 不要评论从认证的角度来看这是否可以这样做......应用程序激活是通过股票合同 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)

我能做些什么来完成这项工作?任何想法?

这个出现的调用堆栈是这个(没有用户代码,不被 UnhandledException 事件处理)......

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

4

2 回答 2

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 不会对应用程序同时关闭和打开感到困惑和抱怨。

于 2013-02-25T19:59:56.137 回答
0

你不能。

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

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

于 2013-02-18T19:32:16.600 回答