在 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=]。
有两种情况:
Forefront 应用程序处于 运行 模式:
coredispatcher 可用于请求 UI STA 线程执行操作。
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.
我正在尝试在后台任务中将内容添加到剪贴板,但无法正常工作。这是我的代码:
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=]。
有两种情况:
Forefront 应用程序处于 运行 模式: coredispatcher 可用于请求 UI STA 线程执行操作。
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.