Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Cortana后台任务中设置剪贴板内容_C#_Uwp_Cortana - Fatal编程技术网

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

C# 在Cortana后台任务中设置剪贴板内容,c#,uwp,cortana,C#,Uwp,Cortana,我试图在后台任务中将内容添加到剪贴板,但无法使其正常工作。这是我的密码: var dataPackage = new DataPackage { RequestedOperation = DataPackageOperation.Copy }; dataPackage.SetText("EUREKA!"); Clipboard.Flush(); Clipboard.SetContent(dataPackage); 我收到错误消息: 不支持从MTA激活单线程类 (来自HRESULT:0x8000

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

var dataPackage = new DataPackage { RequestedOperation = DataPackageOperation.Copy };
dataPackage.SetText("EUREKA!");
Clipboard.Flush();
Clipboard.SetContent(dataPackage);
我收到错误消息:

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

我找到了一个解决方案,但建议的解决方案是:

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++开发的应用程序,后台任务托管在一个在PROC DLL中(由应用程序或专用的BeaBeaTaskHoo.exe加载),其在<强> MTA中。p> 有两种情况:

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

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

  • 因此请记住:

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


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