在 Cortana 后台任务中设置剪贴板内容

Set Clipboard content in Cortana background task

我正在尝试在后台任务中将内容添加到剪贴板,但无法正常工作。这是我的代码:

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

我收到错误消息:

Activating a single-threaded class from MTA is not supported (Exception from HRESULT: 0x8000001D) System.Exception {System.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

第一个错误信息很清楚。剪贴板需要 STA 线程。对于由 c#(您的案例)或 c++ 开发的应用程序,后台任务托管在 MTA[= 中的进程内 DLL(由应用程序或专用 BackgroundtaskHost.exe 加载)中27=]。

有两种情况:

  1. Forefront 应用程序处于 运行 模式: coredispatcher 可用于请求 UI STA 线程执行操作。

  2. Forefront 应用已暂停或终止: 后台任务(当应用程序用 c# 和 c++ 编写时)始终以 MTA 模式运行并且 UI STA 线程不存在,因此如果 class 不存在,我们不能在后台任务中使用剪贴板'支持从MTA激活。

所以记住这个:

The only reliable way for the background task to share state is to use persistent storage, such as ApplicationData, or files.