Übertragen von Shellobjekten mit Drag-and-Drop und der Zwischenablage

Viele Anwendungen ermöglichen es Benutzern, Daten in eine andere Anwendung zu übertragen, indem sie die Daten mit der Maus ziehen und ablegen oder die Zwischenablage verwenden. Zu den vielen Arten von Daten, die übertragen werden können, gehören Shell-Objekte wie Dateien oder Ordner. Die Shell-Datenübertragung kann zwischen zwei Anwendungen erfolgen, benutzer können jedoch auch Shelldaten an oder vom Desktop oder windows Explorer übertragen.

Obwohl Dateien das am häufigsten übertragene Shell-Objekt sind, kann die Shell-Datenübertragung eine vielzahl von Objekten im Shell-Namespace umfassen. Für instance muss Ihre Anwendung möglicherweise eine Datei in einen virtuellen Ordner wie den Papierkorb übertragen oder ein Objekt aus einer Nicht-Microsoft-Namespaceerweiterung akzeptieren. Wenn Sie eine Namespaceerweiterung implementieren, muss sie sich ordnungsgemäß als Ablagequelle und Ziel verhalten können.

In diesem Dokument wird erläutert, wie Anwendungen Drag-and-Drop- und Zwischenablagedatenübertragungen mit Shellobjekten implementieren können.

Funktionsweise von Drag-and-Drop mit Shellobjekten

Anwendungen müssen Benutzern häufig eine Möglichkeit zum Übertragen von Shell-Daten bieten. Beispiele:

  • Ziehen Sie eine Datei von Windows Explorer oder dem Desktop, und legen Sie sie in einer Anwendung ab.
  • Kopieren einer Datei in die Zwischenablage in Windows Explorer und Einfügen in eine Anwendung.
  • Ziehen einer Datei aus einer Anwendung in den Papierkorb.

Eine ausführliche Erläuterung zum Umgang mit diesen und anderen Szenarien finden Sie unter Behandeln von Shell-Datenübertragungsszenarien. Dieses Dokument konzentriert sich auf die allgemeinen Prinzipien der Shell-Datenübertragung.

Windows bietet zwei Standardmethoden für Anwendungen zum Übertragen von Shelldaten:

  • Ein Benutzer schneidet Oder kopiert Shelldaten, z. B. eine oder mehrere Dateien, in die Zwischenablage. Die andere Anwendung ruft die Daten aus der Zwischenablage ab.
  • Ein Benutzer zieht ein Symbol, das die Daten aus der Quellanwendung darstellt, und legt das Symbol in einem Fenster ab, das dem Ziel gehört.

In beiden Fällen sind die übertragenen Daten in einem Datenobjekt enthalten. Datenobjekte sind COM-Objekte (Component Object Model), die die IDataObject-Schnittstelle verfügbar machen. Schematisch gibt es drei wesentliche Schritte, die alle Shell-Datenübertragungen ausführen müssen:

  1. Die Quelle erstellt ein Datenobjekt, das die zu übertragenden Daten darstellt.
  2. Das Ziel empfängt einen Zeiger auf die IDataObject-Schnittstelle des Datenobjekts.
  3. Das Ziel ruft die IDataObject-Schnittstelle auf, um die Daten daraus zu extrahieren.

Der Unterschied zwischen Zwischenablage- und Drag-and-Drop-Datenübertragungen liegt in erster Linie darin, wie der IDataObject-Zeiger von der Quelle an das Ziel übertragen wird.

Zwischenablagedatenübertragungen

Die Zwischenablage ist die einfachste Möglichkeit zum Übertragen von Shelldaten. Das grundlegende Verfahren ähnelt den Standardmäßigen Zwischenablage-Datenübertragungen. Da Sie jedoch einen Zeiger auf ein Datenobjekt und nicht auf die Daten selbst übertragen, müssen Sie die OLE-Zwischenablage-API anstelle der Standardablage-API verwenden. Im folgenden Verfahren wird beschrieben, wie Sie die OLE-Zwischenablage-API verwenden, um Shelldaten mit der Zwischenablage zu übertragen:

  1. Die Datenquelle erstellt ein Datenobjekt, das die Daten enthält.
  2. Die Datenquelle ruft OleSetClipboard auf, das einen Zeiger auf die IDataObject-Schnittstelle des Datenobjekts in der Zwischenablage platziert.
  3. Das Ziel ruft OleGetClipboard auf, um den Zeiger auf die IDataObject-Schnittstelle des Datenobjekts abzurufen.
  4. Das Ziel extrahiert die Daten, indem die IDataObject::GetData-Methode aufgerufen wird .
  5. Bei einigen Shell-Datenübertragungen muss das Ziel möglicherweise auch die IDataObject::SetData-Methode des Datenobjekts aufrufen, um feedback an das Datenobjekt zum Ergebnis der Datenübertragung zu geben. Ein Beispiel für diese Art von Vorgang finden Sie unter Behandeln optimierter Verschiebungsvorgänge .

Drag-and-Drop-Datenübertragungen

Obwohl die Implementierung etwas komplexer ist, hat die Drag-and-Drop-Datenübertragung einige erhebliche Vorteile gegenüber der Zwischenablage:

  • Drag-and-Drop-Übertragungen können mit einer einfachen Mausbewegung durchgeführt werden, wodurch die Bedienung flexibler und intuitiver zu bedienen ist als die Zwischenablage.
  • Drag-and-Drop bietet dem Benutzer eine visuelle Darstellung des Vorgangs. Der Benutzer kann dem Symbol folgen, während es von der Quelle zum Ziel wechselt.
  • Drag-and-Drop benachrichtigt das Ziel, wenn die Daten verfügbar sind.

Drag-and-Drop-Vorgänge verwenden auch Datenobjekte zum Übertragen von Daten. Die Ablagequelle muss jedoch Funktionen bereitstellen, die über die für Zwischenablageübertragungen hinausgehen:

  • Die Ablagequelle muss auch ein Objekt erstellen, das eine IDropSource-Schnittstelle verfügbar macht. Das System verwendet IDropSource , um mit der Quelle zu kommunizieren, während der Vorgang ausgeführt wird.
  • Das Drag-and-Drop-Datenobjekt ist für die Verfolgung der Cursorbewegung und das Anzeigen eines Symbols zur Darstellung des Datenobjekts verantwortlich.

Ablageziele müssen auch mehr Funktionen bieten, als zum Verarbeiten von Zwischenablageübertragungen erforderlich sind:

  • Das Ablageziel muss eine IDropTarget-Schnittstelle verfügbar machen. Wenn sich der Cursor über einem Zielfenster befindet, verwendet das System IDropTarget , um dem Ziel Informationen wie die Cursorposition bereitzustellen und es zu benachrichtigen, wenn die Daten gelöscht werden.
  • Das Ablageziel muss sich beim System registrieren, indem RegisterDragDrop aufgerufen wird. Diese Funktion stellt dem System den Handle auf ein Zielfenster und einen Zeiger auf die IDropTarget-Schnittstelle der Zielanwendung bereit.

Hinweis

Bei Drag-and-Drop-Vorgängen muss Ihre Anwendung COM mit OleInitialize und nicht mit CoInitialize initialisieren.

 

Im folgenden Verfahren werden die wesentlichen Schritte beschrieben, die normalerweise zum Übertragen von Shelldaten per Drag-and-Drop verwendet werden:

  1. Das Ziel ruft RegisterDragDrop auf, um dem System einen Zeiger auf seine IDropTarget-Schnittstelle zu geben und ein Fenster als Ablageziel zu registrieren.
  2. Wenn der Benutzer einen Drag-and-Drop-Vorgang startet, erstellt die Quelle ein Datenobjekt und initiiert eine Ziehschleife durch Aufrufen von DoDragDrop.
  3. Wenn sich der Cursor über dem Zielfenster befindet, benachrichtigt das System das Ziel, indem es eine der IDropTarget-Methoden des Ziels aufruft. Das System ruft IDropTarget::D ragEnter auf, wenn der Cursor in das Zielfenster eintritt, und IDropTarget::D ragOver , wenn der Cursor das Zielfenster überläuft. Beide Methoden stellen das Ablageziel mit der aktuellen Cursorposition und dem Zustand der Tastaturmodifizierertasten wie STRG oder ALT bereit. Wenn der Cursor das Zielfenster verlässt, benachrichtigt das System das Ziel, indem es IDropTarget::D ragLeave aufruft. Wenn eine dieser Methoden zurückgegeben wird, ruft das System die IDropSource-Schnittstelle auf, um den Rückgabewert an die Quelle zu übergeben.
  4. Wenn der Benutzer die Maustaste loslässt, um die Daten zu löschen, ruft das System die IDropTarget::D rop-Methode des Ziels auf. Zu den Parametern der Methode gehört ein Zeiger auf die IDataObject-Schnittstelle des Datenobjekts.
  5. Das Ziel ruft die IDataObject::GetData-Methode des Datenobjekts auf, um die Daten zu extrahieren.
  6. Bei einigen Shell-Datenübertragungen muss das Ziel möglicherweise auch die IDataObject::SetData-Methode des Datenobjekts aufrufen, um der Quelle Feedback zum Ergebnis der Datenübertragung zu geben.
  7. Wenn das Ziel mit dem Datenobjekt abgeschlossen ist, wird es von IDropTarget::D rop zurückgegeben. Das System gibt den DoDragDrop-Aufruf der Quelle zurück, um die Quelle darüber zu informieren, dass die Datenübertragung abgeschlossen ist.
  8. Abhängig vom jeweiligen Datenübertragungsszenario muss die Quelle möglicherweise zusätzliche Aktionen ausführen, die auf dem von DoDragDrop zurückgegebenen Wert und den Werten basieren, die vom Ziel an das Datenobjekt übergeben werden. Für instance muss die Quelle beim Verschieben einer Datei diese Werte überprüfen, um zu bestimmen, ob sie die ursprüngliche Datei löschen muss.
  9. Die Quelle gibt das Datenobjekt frei.

Während die oben beschriebenen Prozeduren ein gutes allgemeines Modell für die Shell-Datenübertragung bieten, gibt es viele verschiedene Datentypen, die in einem Shell-Datenobjekt enthalten sein können. Es gibt auch eine Reihe verschiedener Datenübertragungsszenarien, die Ihre Anwendung möglicherweise verarbeiten muss. Jeder Datentyp und jedes Szenario erfordert einen etwas anderen Ansatz für drei wichtige Schritte in der Prozedur:

  • Wie eine Quelle ein Datenobjekt erstellt, das die Shell-Daten enthält.
  • Wie ein Ziel Shell-Daten aus dem Datenobjekt extrahiert.
  • Wie die Quelle den Datenübertragungsvorgang abschließt.

Das Shell-Datenobjekt bietet eine allgemeine Erläuterung darüber, wie eine Quelle ein Shell-Datenobjekt erstellt und wie dieses Datenobjekt vom Ziel behandelt werden kann. Mit Shell-Datenübertragungsszenarien wird ausführlich erläutert, wie eine Reihe gängiger Shell-Datenübertragungsszenarien behandelt werden.