2016-06-17 21 views
6

Ich versuche, nicht standardmäßige Daten aus der Zwischenablage mit DataPackageView.GetDataAsync zu erhalten. Ich bin ratlos bei der Umwandlung der zurückgegebenen system.__ComObject in eine Zeichenfolge. HierSo erhalten Sie eine Zeichenfolge von dataPackageView.GetDataAsync()

ist der Code:

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

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

} 

ich nach einer Lösung suchen, die mit jedem Nicht-Standard-Clipboard-Format arbeiten. "FileName" ist ein leicht zu testendes Format, da Sie es in die Zwischenablage kopieren können, indem Sie eine Datei im Windows Explorer kopieren.

In C++/Win32, kann ich die Daten aus der Zwischenablage erhalten wie folgt:

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

In C++, die Daten aus der Zwischenablage ist nur ein Byte-Array. Es muss möglich sein, den gleichen Byte-Array in C# zu bekommen, aber ich habe keine Ahnung, auf Abwickeln/die system.__ComObject

bearbeitet Umwandlung: Umformulierung die Frage:

Wie erhalte ich einen String oder Array von Byes aus dem System .__ ComObject zurückgegeben von dataPackageView.GetDataAsync (someFormat), wobei someFormat ein beliebiges Zwischenablageformat ist, das von einer anderen Anwendung erstellt wurde?

Es ist mir sehr klar, wie man die Daten bekommt. Der schwierige Teil verwendet die Daten, die zurückgegeben werden.

Die akzeptierte Antwort muss zeigen, wie eine Zeichenfolge oder ein Array von Bytes aus den „Daten“ von

var data = await dataPackageView.GetDataAsync(someFormat); 

Antwort

2

Dieser Artikel erklärt, wie benutzerdefinierte Datapackage-Objekte implementiert sind.

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

Der Schlüssel ist, den Rückgabewert von dataPackageView.GetAsync() in eine IRandomAccessStream

hier zu werfen ist etwas, das funktioniert:

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 
} 

Dies sollte für jede Arbeit benutzerdefiniertes Datenformat, nicht nur "FileName".Wenn Sie keine Zeichenfolge benötigen, können Sie einfach die von IRandomAccessStream verfügbaren Bytes verwenden.

3

zurück zu erstellen, wenn Sie sich eine Datei kennen Sie den folgenden Code verwenden können

var content = Clipboard.GetContent(); 

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

von MSDN article on StandardDataFormats

Die Datapackage Klasse zwischen W eine Reihe von Legacy-Formate für die Interoperabilität unterstützt Apps Speichern Sie Apps und Desktop-Apps. Um diese Formate abzurufen, übergeben Sie eine der folgenden Zeichenfolgen an die DataPackageView.GetDataAsync-Methode anstelle eines Werts aus der StandardDataFormats-Klasse.

zB

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

Die Daten, die ich erhalten möchte, ist nicht unbedingt eine Datei. Wie in der Frage angegeben, suche ich nach einer Lösung, die mit jedem nicht standardmäßigen Zwischenablageformat funktioniert. –

+0

Ich weiß, deshalb habe ich Sie auf den Artikel hingewiesen, der unterstützte Formate enthält. – SWilko

+0

Der oben verlinkte MSDN-Artikel enthält keine Details zum Arbeiten mit den Daten, die von dataPackageView.GetDataAsync zurückgegeben werden. Der Code, den ich in der Frage aufgelistet habe, ruft DataPackageView.GetDataAsync bereits auf, wie der Artikel empfiehlt. Der Hauptpunkt meiner Frage ist, was mit diesen Daten zu tun ist. Die zurückgegebenen Daten sind ein System .__ ComObject, und ich habe keine Ahnung, wie man es benutzt. –

Verwandte Themen