如何从 dataPackageView.GetDataAsync() 获取字符串
How to get string from dataPackageView.GetDataAsync()
我正在尝试使用 DataPackageView.GetDataAsync
从剪贴板获取非标准格式的数据。我很难将返回的 system.__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 Explorer 中复制文件将其放在剪贴板上。
在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# 中获得相同的字节数组,但我对 unwrapping/converting 和 system.__ComObject
毫无头绪
编辑:重新表述问题:
如何从 dataPackageView.GetDataAsync(someFormat) 返回的 system.__ComObject 中获取字符串或 byes 数组,其中 someFormat 是由另一个应用程序创建的任意剪贴板格式?
我很清楚如何获取数据。困难的部分是使用返回的数据。
接受的答案必须说明如何从
返回的 "data" 创建字符串或字节数组
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
本文介绍了自定义数据包对象的实现方式。
http://www.minddriven.de/index.php/technology/dot-net/c-sharp/winrt-datapackage-custom-objects
关键是将 dataPackageView.GetAsync() 的 return 值转换为 IRandomAccessStream
这是有效的方法:
var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
if (dataPackageView.Contains("FileName"))
{
var data = await dataPackageView.GetDataAsync("FileName");
// convert data to string
var data = await dataPackageView.GetDataAsync("FileName");
var dataObj = data as IRandomAccessStream;
var stream = dataObj.GetInputStreamAt(0);
IBuffer buff = new Windows.Storage.Streams.Buffer((uint)dataObj.Size);
await stream.ReadAsync(buff, (uint)dataObj.Size, InputStreamOptions.None);
var filePath = Encoding.ASCII.GetString(buff.ToArray());
filePath = filePath.Replace("[=10=]","");//get rid of null characters
}
这应该适用于任何自定义数据格式,而不仅仅是 "FileName"。如果您不需要字符串,您可以只使用 IRandomAccessStream 中可用的字节。
我正在尝试使用 DataPackageView.GetDataAsync
从剪贴板获取非标准格式的数据。我很难将返回的 system.__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 Explorer 中复制文件将其放在剪贴板上。
在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# 中获得相同的字节数组,但我对 unwrapping/converting 和 system.__ComObject
编辑:重新表述问题:
如何从 dataPackageView.GetDataAsync(someFormat) 返回的 system.__ComObject 中获取字符串或 byes 数组,其中 someFormat 是由另一个应用程序创建的任意剪贴板格式?
我很清楚如何获取数据。困难的部分是使用返回的数据。
接受的答案必须说明如何从
返回的 "data" 创建字符串或字节数组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
本文介绍了自定义数据包对象的实现方式。
http://www.minddriven.de/index.php/technology/dot-net/c-sharp/winrt-datapackage-custom-objects
关键是将 dataPackageView.GetAsync() 的 return 值转换为 IRandomAccessStream
这是有效的方法:
var dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
if (dataPackageView.Contains("FileName"))
{
var data = await dataPackageView.GetDataAsync("FileName");
// convert data to string
var data = await dataPackageView.GetDataAsync("FileName");
var dataObj = data as IRandomAccessStream;
var stream = dataObj.GetInputStreamAt(0);
IBuffer buff = new Windows.Storage.Streams.Buffer((uint)dataObj.Size);
await stream.ReadAsync(buff, (uint)dataObj.Size, InputStreamOptions.None);
var filePath = Encoding.ASCII.GetString(buff.ToArray());
filePath = filePath.Replace("[=10=]","");//get rid of null characters
}
这应该适用于任何自定义数据格式,而不仅仅是 "FileName"。如果您不需要字符串,您可以只使用 IRandomAccessStream 中可用的字节。