c# – 如何从dataPackageView.GetDataAsync()获取字符串

我正在尝试使用DataPackageView.GetDataAsync从剪贴板中获取非标准格式的数据.我很难将返回的系统.__ ComObject转换为字符串.

这是代码

var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();

if (dataPackageView.Contains("FileName"))
{
  var data = await dataPackageView.GetDataAsync("FileName");
  // How to convert data to string?

}

我正在寻找一种适用于任何非标准剪贴板格式的解决方案. “FileName”是一种易于测试的格式,因为您可以通过在Windows资源管理器中复制文件将其放在剪贴板上.

在C / Win32中,我可以获得如下剪贴板数据:

OpenClipboard(nullptr);
UINT clipboarFormat = RegisterClipboardFormat(L"FileName");
HANDLE hData = GetClipboardData(clipboarFormat);
char * pszText = static_cast<char*>(GlobalLock(hData));
GlobalUnlock(hData);
CloseClipboard();

在C中,剪贴板数据只是一个字节数组.必须可以在C#中获得相同的字节数组,但我不知道解包/转换系统.__ ComObject

编辑:改述问题:

如何从系统中获取字符串或数组.___由DataPackageView.GetDataAsync(someFormat)返回的ComObject,其中someFormat是由另一个应用程序创建的任意剪贴板格式?

我很清楚如何获取数据.困难的部分是使用返回的数据.

接受的答案必须显示如何从返回的“数据”创建字符串或字节数组

var data = await dataPackageView.GetDataAsync(someFormat);

解决方法

如果你知道它的文件,你可以使用以下代码
var content = Clipboard.GetContent();

IReadOnlyList<IStorageItem> files = await content.GetStorageItemsAsync();
var file = files.First() as StorageFile;

MSDN article on StandardDataFormats

The DataPackage class supports a number of legacy formats for interoperability between Windows Store apps and desktop apps. To retrieve these formats,you pass one of the following strings to the DataPackageView.GetDataAsync method instead of a value from the StandardDataFormats class.

例如

var content = Clipboard.GetContent();
var data = await content.GetDataAsync("PenData"); //Stream for HGLOBAL corresponding to CF_PENDATA

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...