关闭的 Windows 通用应用程序的剪贴板内容

Posted

技术标签:

【中文标题】关闭的 Windows 通用应用程序的剪贴板内容【英文标题】:Clipboard content of closed Windows Universal App 【发布时间】:2015-10-25 04:33:25 【问题描述】:

我编写了一个 C# Windows 通用应用程序,用户可以在其中将文件复制到剪贴板。但是如果应用程序关闭,剪贴板内容就会丢失。如果用户可以很容易地丢失他的剪贴板内容,那么可用性是可怕的。有没有办法让应用程序的剪贴板内容像任何其他经典 Windows 应用程序一样持久化?

示例代码:

public static void CopyFileToClipboard(StorageFile file) 
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    dp.SetStorageItems(new List<StorageFile>()  file );
    Clipboard.SetContent(dp); // not available after app closed
    Clipboard.Flush();


public static void CopyTextToClipboard(string text) 
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    dp.SetText(text); // available after app closed
    Clipboard.SetContent(dp);
    Clipboard.Flush();


//I have tried to copy the file to the app folder first but it has nothing changed.
public async static void CacheAndCopyFileToClipboard(StorageFile file) 
    DataPackage dp = new DataPackage();
    dp.RequestedOperation = DataPackageOperation.Copy;
    var xfile = await ApplicationData.Current.LocalFolder.CreateFileAsync(file.Name);
    await file.CopyAndReplaceAsync(xfile);
    dp.SetStorageItems(new List<StorageFile>()  xfile );
    Clipboard.SetContent(dp); // not available after app closed
    Clipboard.Flush();

所以问题是如何将文件放到剪贴板,以便即使应用程序关闭用户也可以粘贴它?

编辑: 这似乎是所有 Windows 通用应用程序的问题,例如,如果您在 Windows 照片应用程序中复制图片,则只能在照片应用程序运行时粘贴它。我无法想象这种奇怪的行为应该是Apps的默认行为。它看起来更像是一个错误,因为我看不出这种奇怪行为的原因。

Edit2:问题的新示例(感谢 Joe300 的反馈)。它适用于字符串,但不适用于 StorageFile(即使它首先复制到本地应用程序文件夹)。 Flush() 命令对文件不起作用的原因是什么?使用文件时有什么特别需要考虑的吗(权限,...)?

【问题讨论】:

【参考方案1】:

您需要添加对Flush 的调用,以便在应用关闭后内容可用。

将内容添加到剪贴板并释放 DataPackage 对象 从源应用程序。此方法允许内容保留 应用程序关闭后可用。

你还应该设置RequestedOperation:

dp.RequestedOperation = DataPackageOperation.Copy;
try

    Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dp);
    Clipboard.Flush();

catch (Exception ex)

   // Copying data to Clipboard can potentially fail - for example, if another application is holding Clipboard open                  

除此之外,真的没有任何其他选项可用于操作Clipboard

【讨论】:

如果我关闭应用程序文件丢失,它并没有解决问题。调用 Clipboard.Flush() 并没有改变这一点,尽管这个命令的描述看起来像是解决方案。也许这是 StorageFile 对象的问题,因为它似乎正在处理字符串。 你是如何初始化StorageFile的? dp.Flush();仅剪贴板上的 DataPackage 上不存在。 StorageFile 和 SetContent 应该不是问题,因为在应用程序运行时一切正常,但如果应用程序关闭,剪贴板会丢失内容。我的原始代码的 Flush 和 DataPackageOperation.Copy 扩展并不能解决这个问题... 如果应用程序退出后文件无法访问,剪贴板文件操作将无法进行。我在代码中的Flush 确实是一个错字。你是如何创建和初始化文件的? Clipboard.Flush(); 需要 Clipboard.SetContent(dp); 之后才能在应用程序关闭后保留在剪贴板中。 Clipboard.SetContent(dp); Clipboard.Flush();

以上是关于关闭的 Windows 通用应用程序的剪贴板内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上的 Bash 的 vim 中“复制到剪贴板”? [关闭]

Delphi的windows剪切板操作函数

怎样将vim中的内容复制到windows剪切板?

支付宝剪贴板开启有啥用

WPF 推荐一个剪贴板内容查看工具

WPF 推荐一个剪贴板内容查看工具