2016-06-17 18 views
6

Próbuję uzyskać niestandardowe formatowanie danych ze schowka przy użyciu DataPackageView.GetDataAsync. Zastanawiam się nad konwersją zwróconego system.__ComObject na ciąg znaków.Jak uzyskać ciąg od dataPackageView.GetDataAsync()

Oto kod:

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

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

} 

szukam rozwiązanie, które będzie pracować z każdym niestandardowym formacie schowka. "FileName" jest formatem łatwym do przetestowania, ponieważ można go umieścić w schowku, kopiując plik w Eksploratorze Windows.

W C++/Win32 mogę uzyskać dane schowka następująco:

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

W C++, dane Schowek jest tylko tablicą bajtów. To musi być możliwe, aby uzyskać tę samą tablicę bajtów w C#, ale nie mam pojęcia o rozpakowanie/przekształcenie system.__ComObject

Edycja: Parafrazując pytanie:

Jak uzyskać ciąg lub tablicę byes z systemu .__ ComObject zwrócony przez dataPackageView.GetDataAsync (someFormat), gdzie someFormat jest arbitralnym formatem schowka utworzonym przez inną aplikację?

Jest bardzo jasne, jak uzyskać dane. Najtrudniejszą częścią jest wykorzystanie zwróconych danych.

Przyjęty odpowiedź musi pokazać, jak stworzyć łańcuch lub tablicę bajtów z „dane” zwróconych przez

var data = await dataPackageView.GetDataAsync(someFormat); 

Odpowiedz

2

tym artykule wyjaśniono, jak zwyczaj dataPackage cele są realizowane.

http://www.minddriven.de/index.php/technology/dot-net/c-sharp/winrt-datapackage-custom-objects

Kluczem jest rzutować wartości zwracanej dataPackageView.GetAsync() w jego IRandomAccessStream

Oto coś, co działa:

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("\0","");//get rid of null characters 
} 

ten powinien pracować dla dowolnego niestandardowy format danych, a nie tylko "Nazwa pliku".Jeśli nie potrzebujesz łańcucha, możesz po prostu użyć bajtów dostępnych z IRandomAccessStream.

3

jeśli znasz jego plik można użyć następującego kodu

var content = Clipboard.GetContent(); 

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

Od MSDN article on StandardDataFormats

Klasa DataPackage obsługuje wiele starszych formatów dla interoperacyjności W indows Przechowuj aplikacje i aplikacje komputerowe. Aby pobrać te formaty, należy przekazać jeden z następujących łańcuchów do metody DataPackageView.GetDataAsync zamiast wartości z klasy StandardDataFormats.

np

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

Dane, które chcę uzyskać, niekoniecznie są plikami. Jak stwierdzono w pytaniu, szukam rozwiązania, które będzie działać z każdym niestandardowym formatem schowka. –

+0

Wiem, dlaczego wskazałem ci artykuł zawierający obsługiwane formaty. – SWilko

+0

Artykuł MSDN, do którego odnośniki powyżej, nie zawiera żadnych szczegółów dotyczących pracy z danymi zwróconymi przez dataPackageView.GetDataAsync. Kod, który podałem w pytaniu, już wywołuje metodę dataPackageView.GetDataAsync, zgodnie z zaleceniami artykułu. Głównym punktem mojego pytania jest to, co zrobić z tymi danymi. Zwrócone dane to system .__ ComObject i nie mam pojęcia, jak z niego korzystać. –

Powiązane problemy