Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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. Shell-Datenübertragungen können zwischen zwei Anwendungen erfolgen, benutzer können jedoch auch Shell-Daten an oder vom Desktop oder Windows Explorer übertragen.
Obwohl Dateien das am häufigsten übertragene Shell-Objekt sind, kann die Shell-Datenübertragung beliebige Objekte im Shell-Namespace umfassen. Ihre Anwendung muss beispielsweise eine Datei in einen virtuellen Ordner wie den Papierkorb übertragen oder ein Objekt aus einer Namespace-Erweiterung eines anderen Anbieters als Microsoft akzeptieren. Wenn Sie eine Namespaceerweiterung implementieren, muss sie sich ordnungsgemäß als Drop-Quelle und Ziel verhalten können.
In diesem Dokument wird erläutert, wie Anwendungen Drag-and-Drop- und Zwischenablagedatenübertragungen mit Shell-Objekten implementieren können.
Funktionsweise von Drag-and-Drop mit Shell-Objekten
Anwendungen müssen Benutzern häufig eine Möglichkeit zum Übertragen von Shell-Daten bieten. Einige Beispiele sind:
- Ziehen einer Datei aus dem Windows-Explorer oder vom Desktop und Ablegen in einer Anwendung.
- Kopieren einer Datei in die Zwischenablage im Windows-Explorer und Einfügen in eine Anwendung.
- Ziehen einer Datei aus einer Anwendung in den Papierkorb.
Eine ausführliche Erläuterung zur Behandlung dieser und anderer 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 Shell-Daten:
- Ein Benutzer schneidet Shelldaten, z. B. eine oder mehrere Dateien, in die Zwischenablage aus oder kopiert sie. Die andere Anwendung ruft die Daten aus der Zwischenablage ab.
- Benutzer ziehen ein Symbol, das die Daten aus der Quellanwendung darstellt, und legen 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 befolgen müssen:
- Die Quelle erstellt ein Datenobjekt, das die zu übertragenden Daten darstellt.
- Das Ziel empfängt einen Zeiger auf die IDataObject-Schnittstelle des Datenobjekts.
- 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.
Zwischenablage Datenübertragungen
Die Zwischenablage ist die einfachste Möglichkeit zum Übertragen von Shell-Daten. Das grundlegende Verfahren ähnelt standardmäßigen Übertragungen von Zwischenablagedaten. Da Sie jedoch einen Zeiger auf ein Datenobjekt übertragen, nicht die Daten selbst, müssen Sie die OLE-Zwischenablage-API anstelle der standardmäßigen Zwischenablage-API verwenden. Das folgende Verfahren beschreibt, wie Die OLE-Zwischenablage-API zum Übertragen von Shelldaten mit der Zwischenablage verwendet wird:
- Die Datenquelle erstellt ein Datenobjekt, das die Daten enthält.
- Die Datenquelle ruft OleSetClipboard auf, wodurch ein Zeiger auf die IDataObject-Schnittstelle des Datenobjekts in der Zwischenablage platziert wird.
- Das Ziel ruft OleGetClipboard auf, um den Zeiger auf die IDataObject-Schnittstelle des Datenobjekts abzurufen.
- Das Ziel extrahiert die Daten durch Aufrufen der IDataObject::GetData-Methode .
- Bei einigen Shell-Datenübertragungen muss das Ziel möglicherweise auch die IDataObject::SetData-Methode des Datenobjekts aufrufen, um dem Datenobjekt Feedback zum Ergebnis der Datenübertragung zu geben. Ein Beispiel für diesen Vorgangstyp finden Sie unter Behandeln von optimierten Verschiebungsvorgängen .
Drag-and-Drop-Datenübertragungen
Während die Implementierung etwas komplexer ist, hat die Übertragung von Drag-and-Drop-Daten gegenüber der Zwischenablage einige erhebliche Vorteile:
- Drag-and-Drop-Übertragungen können mit einer einfachen Mausbewegung durchgeführt werden, wodurch die Bedienung flexibler und intuitiver ist als mit der Zwischenablage.
- Drag-and-Drop stellt dem Benutzer eine visuelle Darstellung des Vorgangs bereit. Der Benutzer kann dem Symbol folgen, während es sich von der Quelle zum Ziel bewegt.
- Durch Ziehen und Ablegen wird das Ziel benachrichtigt, wenn die Daten verfügbar sind.
Drag-and-Drop-Vorgänge verwenden auch Datenobjekte zum Übertragen von Daten. Die Dropquelle muss jedoch Funktionen bereitstellen, die über die für Zwischenablageübertragungen erforderlichen hinausgehen:
- Die Dropquelle 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 das Nachverfolgen der Cursorbewegung und das Anzeigen eines Symbols zur Darstellung des Datenobjekts verantwortlich.
Drop-Ziele müssen auch mehr Funktionen bereitstellen, als für die Behandlung von Zwischenablageübertragungen erforderlich sind:
- Das Drop-Ziel muss eine IDropTarget-Schnittstelle verfügbar machen . Wenn sich der Cursor über einem Zielfenster befindet, verwendet das System IDropTarget , um das Ziel mit Informationen wie der Cursorposition zu versorgen und es zu benachrichtigen, wenn die Daten abgelegt werden.
- Das Drop-Ziel muss sich selbst beim System registrieren, indem RegisterDragDrop aufgerufen wird. Diese Funktion stellt dem System das Handle zu einem Zielfenster und einen Zeiger auf die IDropTarget-Schnittstelle der Zielanwendung zur Verfügung.
Hinweis
Bei Drag-and-Drop-Vorgängen muss Ihre Anwendung COM mit OleInitialize initialisieren, nicht mit CoInitialize.
Im folgenden Verfahren werden die wesentlichen Schritte beschrieben, die normalerweise zum Übertragen von Shell-Daten mit Drag-and-Drop verwendet werden:
- Das Ziel ruft RegisterDragDrop auf, um dem System einen Zeiger auf seine IDropTarget-Schnittstelle zu übergeben und ein Fenster als Drop-Ziel zu registrieren.
- Wenn Benutzer einen Drag-and-Drop-Vorgang starten, erstellt die Quelle ein Datenobjekt und initiiert eine Ziehschleife, indem DoDragDrop aufgerufen wird.
- Wenn sich der Cursor über dem Zielfenster befindet, benachrichtigt das System das Ziel durch Aufrufen einer der IDropTarget-Methoden des Ziels. Das System ruft IDropTarget::DragEnter auf, wenn der Cursor in das Zielfenster wechselt, und IDropTarget::DragOver auf, wenn der Cursor über das Zielfenster fährt. Beide Methoden stellen dem Dropziel die aktuelle Cursorposition und den Zustand der Tastenmodifizierer wie STRG oder ALT zur Verfügung. Wenn der Cursor das Zielfenster verlässt, benachrichtigt das System das Ziel durch Aufrufen von IDropTarget::DragLeave. Wenn eine dieser Methoden zurückgegeben wird, ruft das System die IDropSource-Schnittstelle auf, um den Rückgabewert an die Quelle zu übergeben.
- Wenn der Benutzer die Maustaste loslässt, um die Daten abzulegen, ruft das System die IDropTarget::Drop-Methode des Ziels auf. Bei den Parametern der Methode handelt es sich um einen Zeiger auf die IDataObject-Schnittstelle des Datenobjekts.
- Das Ziel ruft die IDataObject::GetData-Methode des Datenobjekts auf, um die Daten zu extrahieren.
- 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.
- Wenn das Ziel mit dem Datenobjekt fertig ist, kehrt es von IDropTarget::Dropzurück. Das System kehrt aus dem DoDragDrop-Aufruf der Quelle zurück, um die Quelle zu benachrichtigen, dass die Datenübertragung abgeschlossen ist.
- Abhängig vom jeweiligen Datenübertragungsszenario muss die Quelle möglicherweise zusätzliche Aktionen basierend auf dem von DoDragDrop zurückgegebenen Wert und den Werten ausführen, die vom Ziel an das Datenobjekt übergeben werden. Wenn beispielsweise eine Datei verschoben wird, muss die Quelle diese Werte überprüfen, um zu bestimmen, ob sie die Originaldatei löschen muss.
- Die Quelle gibt das Datenobjekt frei.
Während die oben beschriebenen Verfahren 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 unterschiedlicher Datenübertragungsszenarien, die Ihre Anwendung möglicherweise verarbeiten muss. Jeder Datentyp und jedes Szenario erfordert einen etwas anderen Ansatz für drei wichtige Schritte im Verfahren:
- 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 Data Object bietet eine allgemeine Erläuterung darüber, wie eine Quelle ein Shell-Datenobjekt erstellt und wie dieses Datenobjekt vom Ziel behandelt werden kann. Umgang mit Shell-Datenübertragungsszenarien erläutert ausführlich, wie eine Reihe allgemeiner Shell-Datenübertragungsszenarien behandelt wird.