Laden...

Drag N Drop IDataObject von Chrome etc. is Null

Letzter Beitrag vor 12 Tagen 11 Posts 305 Views
Drag N Drop IDataObject von Chrome etc. is Null

Moinsen,

habe eine WinForms und nutze die bekannte Outlook Drag and Drop in C#
https://cdn.mycsharp.de/forumpostattachments/attachment-13790.cs
https://gist.github.com/MattyBoy4444/521547/06c10b5326e7f5e1dd0c93ac42af6634d4f7b521
ich kann Anhänge aus Outlook verschieben und aus dem Explorer,
bei z.B. Bilder aus Chrome oder Edge bekomme ich nur FileNames und MemoryStream
gibt null aus.

Hier hört es bei mir auf:

case TYMED.TYMED_HGLOBAL:                    
    //to handle a HGlobal the exisitng "GetDataFromHGLOBLAL" method is invoked via
    //reflection
    if (this.GetDataFromHGLOBLALMethod == null) return null;
    return (MemoryStream)this.GetDataFromHGLOBLALMethod.Invoke(this.oleUnderlyingDataObject, new object[] { DataFormats.GetFormat((short)formatetc.cfFormat).Name, medium.unionmember });

Irgendeine Idee wie ich an das Image Objekt komme ?

NET 8.0 x64 und WinForms Anwendung

In Deinem Bild hast Du ein 
underlyingDataObject vom Typ 
System.Windows.Forms.DataObject.

So wie es aussieht, kannst Du über dessen GetImage an das Image = Bitmap herankommen.

DataObject.GetImage Methode (System.Windows.Forms)

und dann

Bitmap bitmap = new Bitmap(image);

Leider komme ich so auch nicht an das Bild ran....

_ContainsImage() is false_

if (((System.Windows.Forms.DataObject)(this.underlyingDataObject)).ContainsImage())
{
    var img = ((System.Windows.Forms.DataObject)(this.underlyingDataObject)).GetImage();
    Bitmap bitmap = new Bitmap(img);
}

Zitat von schorge

bei z.B. Bilder aus Chrome oder Edge bekomme ich nur FileNames und MemoryStream gibt null aus.

Hast du schon einfach versucht mittels ContainsFileDropList und GetFileDropList an diese Dateinamenliste zu gelangen?

Ansonsten kannst du auch mittels GetFormats zuerst schauen, in welchen Formaten das Drag&Drop-Objekt vorliegt.

Die Dateinamen habe ich über:


 string[] filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
MemoryStream[] filestreams = (MemoryStream[])dataObject.GetData("FileContents");

der MemoryStream ist aber leer...

Hast du denn jetzt auch mal meine geposteten Methoden benutzt?

Aber wenn du die Dateinamen hast, dann kannst du damit doch die Bilder per new Bitmap(filename) laden (oder sind dort keine Pfade hinterlegt, sondern nur die reinen Dateinamen?).

Außerdem gibt es auch noch "FileGroupDescriptor"(für die ANSI-Texte). Dazu gefunden habe ich Outlook Drag and Drop in C# (weiß aber nicht, ob dir das weiterhilft oder noch mehr verwirrt).

Aber wenn du die Dateinamen hast, dann kannst du damit doch die Bilder per new Bitmap(filename) laden (oder sind dort keine Pfade hinterlegt, sondern nur die reinen Dateinamen?).

Leider nur die Dateinamen ohne Pfade z.B. DSC12345.jpg

den Outlook Drag and Drop in C# nutze ich ja:

//wrap standard IDataObject in OutlookDataObject
OutlookDataObject dataObject = new OutlookDataObject(e.Data);

So ganz verstehe ich aber nicht, was Chrome oder Edge mit Outlook zu tun hat?

Und wenn nur die Dateinamen geliefert werden, dann ist das ein Fehler von diesen Programmen. Außer es gibt evtl. ein Standardverzeichnis dafür?

Zum Thema Standardverzeichnis:
Kannst Du auf Deinem PC herausfinden, in welchem Ordner die Datei wie z.B. DSC12345.jpg liegt?

Es gibt keine Garantie, dass Drittanwendungen sich so verhalten, wie Du Dir das wünscht.

bei z.B. Bilder aus Chrome oder Edge bekomme ich nur FileNames und MemoryStream gibt null aus.

Verwendet man Drag and Drop mit Chromium-basierten Browsern (zB das Bild einer Webseite), dann wird standardmäßig die URL in der aktuellen Outlook-Version rein kopiert und nicht die Datei selbst.

In alten Versionen wird das Drag- and Drop fast vollständig blockiert.

Beim kopieren aus Chrome oder Edge RM > Bild kopieren funktioniert es:
Aus der Zwischenablage bekomme ich hier ein Bimap gespeichert.

List<string> clipBoardFiles = new List<string>();
IDataObject obj = Clipboard.GetDataObject();
if (obj.GetDataPresent(DataFormats.Bitmap))
{
   Bitmap bmp = (Bitmap)obj.GetData(DataFormats.Bitmap);
   string fileName = "test.jpg";
   bmp.Save(fileName, ImageFormat.Jpeg);
}

Leider beim Drag and Drop nicht, obwohl das IDataObject genau das gleiche mit gleichem Inhalt ist (Bilder im Anhang),
stehe hier irgendwie aus dem Schlauch ...