【问题标题】:Set Clipboard content in Cortana background task在 Cortana 后台任务中设置剪贴板内容
【发布时间】:2015-10-07 01:01:27
【问题描述】:

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

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

我收到错误消息:

不支持从 MTA 激活单线程类 (来自 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

【问题讨论】:

  • Cortana 的 BackgroundTaskHost 可能永远无法访问可用于分派到 UI 线程的 CoreWindow,因为它从不绘制自己的 UI(它只能向 Cortana 发送请求以执行此操作它的代表)。您需要激活您的应用并让它操纵其 CoreWindow 以将某些内容放在剪贴板上。

标签: c# uwp cortana


【解决方案1】:

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

有两种情况:

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

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

所以记住这一点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多