2016-06-17 25 views
6

Sto cercando di ottenere i dati in formato non standard dagli appunti utilizzando DataPackageView.GetDataAsync. Sono stumped sulla conversione del system.__ComObject restituito a una stringa.Come ottenere una stringa da dataPackageView.GetDataAsync()

Ecco il codice:

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

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

} 

Sto cercando una soluzione che funziona con qualsiasi formato di Appunti non standard. "FileName" è un formato facilmente verificabile in quanto è possibile inserirlo negli appunti copiando un file in Esplora risorse.

In C++/Win32, posso ottenere i dati clipboard come segue:

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

In C++, i dati clipboard è solo un array di byte. Deve essere possibile ottenere lo stesso array di byte in C#, ma non ho alcun indizio su scartare/conversione della Edit system.__ComObject

: riformulare la domanda:

Come faccio ad avere una stringa o un array di bye fuori dal sistema .__ ComObject restituito da dataPackageView.GetDataAsync (someFormat), dove someFormat è un formato di clipboard arbitrario creato da un'altra applicazione?

È molto chiaro per me come ottenere i dati. La parte difficile è usare i dati che vengono restituiti.

La risposta accettata deve mostrare come creare una stringa o un array di byte dai "dati" restituiti da

var data = await dataPackageView.GetDataAsync(someFormat); 

risposta

2

Questo articolo spiega come consuetudine oggetti dataPackage applicazione.

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

La chiave è quello di gettare il valore di ritorno di dataPackageView.GetAsync() in un IRandomAccessStream

Ecco qualcosa che funziona:

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 
} 

Questo dovrebbe funzionare per qualsiasi formato dati personalizzato, non solo "FileName".Se non si richiede una stringa, è possibile utilizzare solo i byte disponibili da IRandomAccessStream.

3

se il proprio know un file è possibile utilizzare il seguente codice

var content = Clipboard.GetContent(); 

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

Da MSDN article on StandardDataFormats

La classe DataPackage supporta una serie di formati legacy per l'interoperabilità tra W indows Store apps e desktop apps. Per recuperare questi formati, si passa una delle seguenti stringhe al metodo DataPackageView.GetDataAsync anziché a un valore dalla classe StandardDataFormats.

esempio

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

I dati che voglio ottenere non sono necessariamente un file. Come indicato nella domanda, sto cercando una soluzione che funzioni con qualsiasi formato di appunti non standard. –

+0

So che questo è il motivo per cui ti ho indirizzato all'articolo contenente i formati supportati – SWilko

+0

L'articolo MSDN collegato sopra non fornisce dettagli sull'utilizzo dei dati restituiti da dataPackageView.GetDataAsync. Il codice che ho elencato nella domanda chiama già dataPackageView.GetDataAsync, come consiglia l'articolo. Il punto principale della mia domanda è cosa fare con quei dati. I dati restituiti sono un sistema .__ ComObject e non ho idea di come usarlo. –

Problemi correlati