2015-10-06 71 views
1

我想在后台任务中将内容添加到剪贴板,但是我无法让它工作。这里是我的代码:在Cortana后台任务中设置剪贴板内容

var dataPackage = new DataPackage { RequestedOperation = DataPackageOperation.Copy }; 
dataPackage.SetText("EUREKA!"); 
Clipboard.Flush(); 
Clipboard.SetContent(dataPackage); 

我得到的错误信息:

从MTA激活单线程不支持此类 (从HRESULT异常:0x8000001D)的System.Exception {系统。 Runtime.InteropServices.COMException}

我发现了一个similar question with a Notification and not Cortana但提出的解决方案:

private async Task CopyToClipboard(string strText) 
{ 
    CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
      { 
       var dataPackage = new DataPackage { RequestedOperation = DataPackageOperation.Copy }; 
       dataPackage.SetText("EUREKA!"); 
       Clipboard.SetContent(dataPackage); 

       getText(); 
      }); 

} 
private async void getText() 
{ 
    string t = await Clipboard.GetContent().GetTextAsync(); 
} 

抛出一个System.NullReferenceException

+1

Cortana的BackgroundTaskHost可能永远无法访问可用于分派到UI线程的CoreWindow,因为它从不绘制自己的UI(它只能向Cortana发送请求来代表它) 。你需要激活你的应用程序,并让它操纵它的CoreWindow把一些东西放在剪贴板上。 –

回答

2

第一个错误信息非常清晰。剪贴板期望STA线程。对于由c#(您的案例)或C++开发的应用程序,后台任务托管在MTA中的进程内DLL(由应用程序或专用BackgroundtaskHost.exe加载)中。

有两种情况:

  1. 前沿的应用程序是在运行模式: 的coredispatcher可用于要求UI STA线程来执行操作。

  2. 前沿应用已暂停或终止: 后台任务(当应用程序写在C#和C++)总是运行在MTA模式,并且UI STA线程不存在,所以不能在后台任务使用剪贴板此如果该类不支持从MTA激活,那么情况就是如此。

所以记住这一点:

的后台任务共享状态的唯一可靠的方法是使用持久性存储,如的ApplicationData或文件。