2015-04-01 8 views
6

Werfen Sie einen Blick auf dieses Bild erstellen:Wie ein benutzerdefiniertes Format der Zwischenablage in einer WinForms-Anwendung

img2

Der Screenshot durch Kopieren einer der Kontakte in Ihrer Skype-Liste erzeugt wird. Die Daten enthalten rohe Bytes, die Informationen enthalten, die skype offensichtlich für nützlich hält (in diesem Fall der Name des Kontakts und die Größe des Namens).

Ich möchte dies selbst erreichen.

Hier ist der Code, den ich in einem Versuch verwendet, zu kopieren

byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; 
Clipboard.SetData("My Data", bytes); 

in die Zwischenablage kopieren Welche in die Zwischenablage kopiert. Allerdings bekomme ich ein Datenobjekt Eintrag zusammen mit einigen zusätzlichen Daten hinzugefügt, anstatt nur rohes Bytes:

img2

Die obere Hälfte ist das, was ich sehe. Die untere Hälfte ist, wenn ich einen Screenshot des Bildschirms mache. Beachten Sie, dass es sich nur um rohe Bitmap-Daten handelt.

Kann dies in .NET getan werden?

+1

Bitte sehen: https://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.setdata(v = vs.110) .aspx Die SetData-Methode benötigt das Format, aber es scheint, dass Sie es "Meine Daten" füttern, die nicht ein korrektes Format zu sein scheint. Ich denke, dass Sie SetDataObject verwenden möchten, wenn das Datenformat unbekannt ist. – Hozikimaru

+1

Ich habe diese Bemerkung nicht unten auf der DataFormats-Seite gesehen: 'Fügen Sie der statischen Liste in dieser Klasse ein neues Formatnamen/ID-Nummernpaar hinzu und registrieren Sie das Format mit der Windows-Registrierung als Zwischenablageformat, wenn Sie es übergeben Der Name des Formats. Ich werde mir das ansehen und sehen, wie man es als Format registriert. – MxyL

+1

Sie erhalten bereits ein benutzerdefiniertes Format. Es ist das richtige Format, es kann immer sicher abgerufen werden, egal welche App auf die Zwischenablage zugreift. Automatisches Laden der erforderlichen Assembly und Bereitstellung von Diagnosefunktionen, falls eine Abweichung vorliegt. Rohe Bytes können das natürlich niemals erreichen, es hat keinen Sinn, das überhaupt zu verfolgen. –

Antwort

4

Die zusätzlichen Bytes sind Serialisierungsheader. Sehen Sie diese note aus der MSDN-Dokumentation auf der Clipboard Klasse (Hervorhebung von mir):

Ein Objekt serialisierbar sein muss, damit es in die Zwischenablage gestellt werden. Wenn Sie ein nicht serialisierbares Objekt an eine Zwischenablage-Methode übergeben, schlägt die Methode fehl, ohne eine Ausnahme auszulösen. Weitere Informationen zur Serialisierung finden Sie unter System.Runtime.Serialization. Wenn Ihre Zielanwendung ein sehr spezifisches Datenformat erfordert, können die -Header, die den Daten im Serialisierungsprozess hinzugefügt werden, verhindern, dass die Anwendung Ihre Daten erkennt. Um Ihr Datenformat beizubehalten, fügen Sie Ihre Daten als Byte-Array zu einem MemoryStream hinzu und übergeben Sie den MemoryStream an die SetData-Methode.

So ist die Lösung ist, dies zu tun:

byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; 
MemoryStream stream = new MemoryStream(bytes); 
Clipboard.SetData("My Data", stream);