Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Muchas aplicaciones permiten a los usuarios transferir datos a otra aplicación arrastrando y soltando los datos con el mouse, o mediante el Portapapeles. Entre los muchos tipos de datos que se pueden transferir, se encuentran objetos shell como archivos o carpetas. La transferencia de datos de Shell puede realizarse entre dos aplicaciones, pero los usuarios también pueden transferir datos de Shell a o desde el escritorio o Windows Explorer.
Aunque los archivos son el objeto shell transferido con más frecuencia, la transferencia de datos de Shell puede implicar cualquiera de los diversos objetos que se encuentran en el espacio de nombres shell. Por ejemplo, es posible que la aplicación tenga que transferir un archivo a una carpeta virtual, como la Papelera de reciclaje, o aceptar un objeto de una extensión de espacio de nombres que no sea de Microsoft. Si va a implementar una extensión de espacio de nombres, debe poder comportarse correctamente como origen y destino de arrastre y colocación.
En este documento se describe cómo las aplicaciones pueden implementar transferencias de datos de arrastrar y soltar y del Portapapeles con objetos Shell.
- Objeto de datos de Shell
- Formatos del portapapeles de Shell
- Gestión de escenarios de transferencia de datos de Shell
Cómo funciona la función de arrastrar y soltar con objetos de Shell
A menudo, las aplicaciones necesitan proporcionar a los usuarios una manera de transferir datos de Shell. Ejemplos:
- Arrastrar un archivo desde Windows Explorer o el escritorio y colocarlo en una aplicación.
- Copiar un archivo al portapapeles en el Explorador de Windows y pegarlo en una aplicación.
- Arrastrar un archivo de una aplicación a la Papelera de reciclaje.
Para obtener una explicación detallada sobre cómo administrar estos y otros escenarios, consulta Administración de escenarios de transferencia de datos de Shell. Este documento se centra en los principios generales que subyacen a la transferencia de datos de Shell.
Windows proporciona dos maneras estándar para que las aplicaciones transfieran datos de Shell:
- Un usuario corta o copia datos de Shell, como uno o varios archivos, al Portapapeles. La otra aplicación recupera los datos del Portapapeles.
- Un usuario arrastra un icono que representa los datos de la aplicación de origen y coloca el icono en una ventana propiedad de la aplicación de destino.
En ambos casos, los datos transferidos se encuentran en un objeto de datos. Los objetos de datos son objetos component Object Model (COM) que exponen la interfaz IDataObject . De forma esquemática, hay tres pasos esenciales que deben seguir todas las transferencias de datos de Shell:
- La fuente crea un objeto de datos que representa los datos que se van a transferir.
- El destino recibe un puntero a la interfaz IDataObject del objeto de datos.
- El destino llama a la interfaz IDataObject para extraer los datos de él.
La diferencia entre el Portapapeles y las transferencias de datos de arrastrar y colocar se encuentra principalmente en cómo se transfiere el puntero IDataObject desde el origen al destino.
Transferencias de datos del portapapeles
El Portapapeles es la manera más sencilla de transferir datos de Shell. El procedimiento básico es similar a las transferencias de datos estándar del Portapapeles. Sin embargo, dado que va a transferir un puntero a un objeto de datos, no a los propios datos, debe usar la API del Portapapeles OLE en lugar de la API estándar del Portapapeles. En el procedimiento siguiente se describe cómo usar la API del Portapapeles OLE para transferir datos de Shell con el Portapapeles:
- El origen de datos crea un objeto de datos para contener los datos.
- El origen de datos llama a OleSetClipboard, que coloca un puntero a la interfaz IDataObject del objeto de datos en el Portapapeles.
- El destino llama a OleGetClipboard para recuperar el puntero a la interfaz IDataObject del objeto de datos.
- El destino extrae los datos llamando al método IDataObject::GetData .
- Con algunas transferencias de datos de Shell, es posible que el destino también necesite llamar al método IDataObject::SetData del objeto de datos para proporcionar comentarios al objeto de datos sobre el resultado de la transferencia de datos. Consulte Gestión de operaciones de movimiento optimizadas para obtener un ejemplo de este tipo de operación.
Transferencias de datos de arrastrar y colocar
Aunque algo más compleja de implementar, la transferencia de datos de arrastrar y soltar tiene algunas ventajas significativas sobre el portapapeles:
- Las transferencias de arrastrar y colocar se pueden realizar con un simple movimiento del mouse, lo que hace que la operación sea más flexible e intuitiva para su uso que el Portapapeles.
- Arrastrar y colocar proporciona al usuario una representación visual de la operación. El usuario puede seguir el icono a medida que pasa de origen a destino.
- Arrastrar y colocar notifica al destino cuando los datos están disponibles.
Las operaciones de arrastrar y colocar también usan objetos de datos para transferir datos. Sin embargo, el origen de arrastre debe proporcionar funcionalidad más allá de lo necesario para las transferencias del Portapapeles:
- El origen de arrastre también debe crear un objeto que exponga una interfaz IDropSource. El sistema usa IDropSource para comunicarse con el origen mientras la operación está en curso.
- El objeto de datos de arrastrar y soltar es responsable del seguimiento del movimiento del cursor y de mostrar un icono para representar el objeto de datos.
Los destinos de colocación también deben proporcionar más funcionalidad de la necesaria para controlar las transferencias del Portapapeles:
- El destino de colocación debe exponer una interfaz IDropTarget . Cuando el cursor se sitúa sobre una ventana de destino, el sistema utiliza IDropTarget para proporcionar al destino información como la posición del cursor y para notificarle cuándo se sueltan los datos.
- El destino de colocación debe registrarse en el sistema llamando a RegisterDragDrop. Esta función proporciona al sistema el identificador de una ventana de destino y un puntero a la interfaz IDropTarget de la aplicación de destino.
Note
Para las operaciones de arrastrar y colocar, la aplicación debe inicializar COM con OleInitialize, no CoInitialize.
En el procedimiento siguiente se describen los pasos esenciales que se usan normalmente para transferir datos de Shell con arrastrar y colocar:
- El destino llama a RegisterDragDrop para proporcionar al sistema un puntero a su interfaz IDropTarget y registrar una ventana como destino de colocación.
- Cuando el usuario inicia una operación de arrastrar y colocar, el origen crea un objeto de datos e inicia un bucle de arrastre llamando a DoDragDrop.
- Cuando el cursor está sobre la ventana de destino, el sistema notifica al destino llamando a uno de los métodos IDropTarget del destino. El sistema llama a IDropTarget::DragEnter cuando el cursor entra en la ventana de destino y IDropTarget::DragOver a medida que el cursor pasa sobre la ventana de destino. Ambos métodos proporcionan al destino de soltado la posición actual del cursor y el estado de las teclas modificadoras del teclado, como CTRL o ALT. Cuando el cursor sale de la ventana de destino, el sistema notifica al destino llamando a IDropTarget::DragLeave. Cuando cualquiera de estos métodos devuelve un valor, el sistema llama a la interfaz IDropSource para pasar el valor de retorno a la fuente.
- Cuando el usuario suelta el botón del mouse para soltar los datos, el sistema llama al método IDropTarget::Drop del destino. Entre los parámetros del método se encuentra un puntero a la interfaz IDataObject del objeto de datos.
- El destino llama al método IDataObject::GetData del objeto de datos para extraer los datos.
- Con algunas transferencias de datos de Shell, es posible que el destino también necesite llamar al método IDataObject::SetData del objeto de datos para proporcionar comentarios al origen sobre el resultado de la transferencia de datos.
- Cuando el destino finaliza con el objeto de datos, regresa de IDropTarget::Drop. El sistema devuelve la llamada DoDragDrop del origen para notificar al origen que la transferencia de datos se ha completado.
- Según el escenario de transferencia de datos concreto, es posible que el origen tenga que realizar acciones adicionales en función del valor devuelto por DoDragDrop y los valores que el destino pasa al objeto de datos. Por ejemplo, cuando se mueve un archivo, el origen debe comprobar estos valores para determinar si debe eliminar el archivo original.
- La fuente libera el objeto de datos.
Aunque los procedimientos descritos anteriormente proporcionan un buen modelo general para la transferencia de datos de Shell, hay muchos tipos diferentes de datos que se pueden contener en un objeto de datos de Shell. También hay una serie de escenarios de transferencia de datos diferentes que es posible que la aplicación necesite controlar. Cada tipo de datos y escenario requiere un enfoque ligeramente diferente para tres pasos clave en el procedimiento:
- Cómo construye una fuente un objeto de datos para contener los datos de Shell.
- Cómo extrae un destino los datos de Shell del objeto de datos.
- Cómo la fuente completa la operación de transferencia de datos.
El objeto de datos de Shell proporciona una explicación general de cómo un origen construye un objeto de datos shell y cómo ese objeto de datos puede ser manipulado por el destino. Administración de escenarios de transferencia de datos de Shell describe en detalle cómo administrar varios escenarios comunes de transferencia de datos de Shell.