Partilhar via


Transferindo objetos do shell com o recurso de arrastar e soltar e a área de transferência

Muitos aplicativos permitem que os usuários transfiram dados para outro aplicativo arrastando e soltando os dados com o mouse ou usando a Área de Transferência. Entre os muitos tipos de dados que podem ser transferidos estão objetos Shell, como arquivos ou pastas. A transferência de dados do Shell pode ocorrer entre dois aplicativos, mas os usuários também podem transferir dados do Shell de ou para a área de trabalho ou o Windows Explorer.

Embora os arquivos sejam o objeto Shell mais comumente transferido, a transferência de dados do Shell pode envolver qualquer uma da variedade de objetos encontrados no namespace Shell. Por exemplo, seu aplicativo pode precisar transferir um arquivo para uma pasta virtual, como a Lixeira, ou aceitar um objeto de uma extensão de namespace que não seja da Microsoft. Se você estiver implementando uma extensão de namespace, ela deverá ser capaz de se comportar corretamente como fonte e destino de drop.

Este documento discute como as aplicações podem implementar transferências de dados de arrastar e largar, assim como da Área de Transferência, com objetos do Shell.

Como o recurso de arrastar e soltar funciona com objetos do shell

Os aplicativos geralmente precisam fornecer aos usuários uma maneira de transferir dados do Shell. Alguns exemplos são:

  • Arrastar um ficheiro do Explorador do Windows ou do ambiente de trabalho e largar numa aplicação.
  • Copiar um ficheiro para a Área de Transferência no Explorador do Windows e colá-lo numa aplicação.
  • Arrastar um ficheiro de uma aplicação para o Lixo.

Para obter uma discussão detalhada sobre como lidar com esses e outros cenários, consulte Manipulando cenários de transferência de dados do Shell. Este documento se concentra nos princípios gerais por trás da transferência de dados do Shell.

O Windows fornece duas maneiras padrão para os aplicativos transferirem dados do Shell:

  • Um usuário corta ou copia dados do Shell, como um ou mais arquivos, para a Área de Transferência. O outro aplicativo recupera os dados da área de transferência.
  • Um usuário arrasta um ícone que representa os dados do aplicativo de origem e solta o ícone em uma janela de propriedade do destino.

Em ambos os casos, os dados transferidos estão contidos em um objeto de dados . Os objetos de dados são objetos COM (Component Object Model) que expõem o IDataObject interface. Esquematicamente, há três etapas essenciais que todas as transferências de dados do Shell devem seguir:

  1. A fonte cria um objeto de dados que representa os dados a serem transferidos.
  2. O destino recebe um ponteiro para a interface IDataObject do objeto de dados.
  3. O alvo chama a interface IDataObject para extrair os dados.

A diferença entre a área de transferência e as transferências de dados de arrastar e soltar reside principalmente em como o ponteiro IDataObject é transferido da origem para o destino.

Transferências de dados da área de transferência

A área de transferência é a maneira mais simples de transferir dados do ambiente Shell. O procedimento básico é semelhante às transferências de dados padrão da área de transferência. No entanto, por estar a transferir um ponteiro para um objeto de dados, não os dados em si, deve usar a API da área de transferência OLE em substituição da API da área de transferência padrão. O procedimento a seguir descreve como usar a API da área de transferência OLE para transferir dados do Shell com a Área de Transferência:

  1. A fonte de dados cria um objeto de dados para conter os dados.
  2. A fonte de dados chama OleSetClipboard, que coloca um ponteiro para a interface IDataObject do objeto de dados na área de transferência.
  3. O destino chama OleGetClipboard para recuperar o ponteiro para a interfaceIDataObject do objeto de dados.
  4. O destino extrai os dados chamando o IDataObject::GetData método.
  5. Com algumas transferências de dados do Shell, o destino também pode precisar chamar o método IDataObject::SetData do objeto de dados para fornecer feedback sobre o resultado da transferência de dados. Consulte Gestão de Operações de Movimentação Otimizadas para obter um exemplo deste tipo de operação.

Arrastar e soltar transferências de dados

Embora seja um pouco mais complexa de implementar, a transferência de dados de arrastar e soltar tem algumas vantagens significativas sobre a Área de Transferência.

  • As transferências de arrastar e soltar podem ser feitas com um simples movimento do rato, tornando o processo mais flexível e intuitivo do que a Área de Transferência.
  • Arrastar e soltar fornece ao usuário uma representação visual da operação. O usuário pode seguir o ícone à medida que ele se move da origem para o destino.
  • O arrasto e a soltura notifica o alvo quando os dados estão disponíveis.

As operações de arrastar e soltar também usam objetos de dados para transferir dados. No entanto, a fonte de descarte deve fornecer funcionalidade além da necessária para transferências da área de transferência:

  • A fonte de descarte também deve criar um objeto que exponha uma interface IDropSource. O sistema usa IDropSource para se comunicar com a fonte enquanto a operação está em andamento.
  • O objeto de dados de arrastar e soltar é responsável por acompanhar o movimento do cursor e exibir um ícone para representar o objeto de dados.

Os alvos de descarte também devem fornecer mais funcionalidade do que o necessário para lidar com transferências da área de transferência:

  • O destino de descarte deve expor uma interface IDropTarget. Quando o cursor está sobre uma janela de destino, o sistema usa IDropTarget para fornecer ao destino informações como a posição do cursor e para notificá-lo quando os dados são descartados.
  • O alvo de soltar deve registar-se no sistema chamando RegisterDragDrop. Esta função fornece ao sistema o identificador para uma janela de destino e um ponteiro para a interface IDropTargetdo aplicativo de destino.

Observação

Para operações de arrastar e soltar, seu aplicativo deve inicializar COM com OleInitialize, não CoInitialize.

 

O procedimento a seguir descreve as etapas essenciais que normalmente são usadas para transferir dados do Shell com o recurso de arrastar e soltar:

  1. O destino chama RegisterDragDrop para dar ao sistema um ponteiro para sua interface deIDropTargete registrar uma janela como um destino de soltar.
  2. Quando o usuário inicia uma operação de arrastar e soltar, a fonte cria um objeto de dados e inicia uma de loop de arrastar chamando DoDragDrop.
  3. Quando o cursor está sobre a janela de destino, o sistema notifica o destino chamando um dos métodos IDropTarget . O sistema chama IDropTarget::DragEnter quando o cursor entra na janela de destino e IDropTarget::DragOver quando o cursor passa sobre a janela de destino. Ambos os métodos fornecem ao alvo de queda a posição atual do cursor e o estado das teclas modificadoras do teclado, como CTRL ou ALT. Quando o cursor sai da janela de destino, o sistema notifica o destino chamando IDropTarget::D ragLeave. Quando qualquer um desses métodos retorna, o sistema chama o IDropSource interface para passar o valor de retorno para a origem.
  4. Quando o utilizador solta o botão do rato para largar os dados, o sistema chama o método IDropTarget::Drop do destino . Entre os parâmetros do método está um ponteiro para a interface IDataObject do objeto de dados.
  5. O destino chama o método IDataObject::GetData do objeto de dados para extrair os dados.
  6. Com algumas transferências de dados do Shell, o destino também pode precisar chamar o método IDataObject::SetData do objeto de dados para fornecer feedback à fonte sobre o resultado da transferência de dados.
  7. Quando o destino termina com o objeto de dados, ele retorna de IDropTarget::Drop. O sistema retorna a chamada de DoDragDrop da fonte para informar que a transferência de dados foi concluída.
  8. Dependendo do cenário específico de transferência de dados , a origem pode precisar executar ações adicionais com base no valor retornado peloDoDragDrop eDoDragDrop e nos valores que são passados para o objeto de dados pelo destino. Por exemplo, quando um arquivo é movido, a fonte deve verificar esses valores para determinar se deve excluir o arquivo original.
  9. A fonte libera o objeto de dados.

Embora os procedimentos descritos acima forneçam um bom modelo geral para a transferência de dados do Shell, há muitos tipos diferentes de dados que podem ser contidos em um objeto de dados do Shell. Há também vários cenários diferentes de transferência de dados que seu aplicativo pode precisar manipular. Cada tipo de dados e cenário requer uma abordagem um pouco diferente para três etapas principais do procedimento:

  • Como uma fonte constrói um objeto de dados para conter os dados do Shell.
  • Como um alvo extrai dados do Shell a partir do objeto de dados.
  • Como a fonte conclui a operação de transferência de dados.

O Shell Data Object fornece uma discussão geral sobre como uma fonte constrói um objeto de dados Shell e como esse objeto de dados pode ser manipulado pelo destino. Manipulando cenários de transferência de dados do Shell discute em detalhes como lidar com vários cenários comuns de transferência de dados do Shell.