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

本文关键字:剪贴板 Cortana 后台任务 设置 | 更新日期: 2023-09-27 18:16:05

我试图在后台任务中添加内容到剪贴板,但我无法让它工作。下面是我的代码:

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

我得到错误消息:

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

我在通知中发现了一个类似的问题,而不是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();
}

抛出一个系统。得到NullReferenceException

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

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

有两种情况:

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

  2. Forefront app被暂停或终止:后台任务(当应用程序用c#和c++编写时)总是在MTA模式下运行,UI STA线程不存在,所以如果类不支持MTA激活,我们就不能在后台任务中使用剪贴板。

所以请记住:

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