【问题标题】:How to activate app through protocol activation from share charm如何通过共享魅力的协议激活来激活应用程序
【发布时间】:2013-02-13 20:57:48
【问题描述】:

我正在尝试通过其自己的共享合同激活我的应用(请 - 不要评论从认证的角度来看这是否可行...应用激活是通过共享合同 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 的调用栈是 this(没有用户代码,不被 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 字节 [本机到托管转换]

【问题讨论】:

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


    【解决方案1】:

    解决方案相当简单,虽然有点老派(尽管 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 不会对应用程序同时关闭和打开感到困惑和抱怨。

    【讨论】:

    • 这确实有效,只是在 Windows 8.1 上遇到了同样的问题,并解决了这个问题。谢谢!!
    【解决方案2】:

    你不能。

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 2016-05-19
      • 1970-01-01
      • 2012-03-15
      • 2016-03-09
      • 1970-01-01
      • 2011-07-24
      • 2017-10-22
      • 1970-01-01
      相关资源
      最近更新 更多