2015-10-06 31 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或文件。