끌어서 놓기 및 클립보드를 사용하여 셸 개체 전송

많은 애플리케이션을 사용하면 마우스로 데이터를 끌어서 놓거나 클립보드를 사용하여 다른 애플리케이션으로 데이터를 전송할 수 있습니다. 전송할 수 있는 많은 유형의 데이터 중에는 파일 또는 폴더와 같은 Shell 개체가 있습니다. 셸 데이터 전송은 두 애플리케이션 간에 이루어질 수 있지만 사용자는 데스크톱 또는 Windows Explorer 셸 데이터를 전송할 수도 있습니다.

파일이 가장 일반적으로 전송되는 Shell 개체이지만 Shell 데이터 전송에는 셸 네임스페이스에 있는 다양한 개체가 포함될 수 있습니다. instance 경우 애플리케이션은 파일을 휴지통과 같은 가상 폴더로 전송하거나 Microsoft가 아닌 네임스페이스 확장의 개체를 수락해야 할 수 있습니다. 네임스페이스 확장을 구현하는 경우 드롭 소스 및 대상으로 올바르게 동작할 수 있어야 합니다.

이 문서에서는 애플리케이션이 Shell 개체를 사용하여 끌어서 놓기 및 클립보드 데이터 전송을 구현하는 방법을 설명합니다.

셸 개체에서 끌어서 놓기 작동 방식

애플리케이션은 셸 데이터를 전송하는 방법을 사용자에게 제공해야 하는 경우가 많습니다. 몇 가지 예는 다음과 같습니다.

  • Windows Explorer 또는 바탕 화면에서 파일을 끌어 애플리케이션에 놓습니다.
  • Windows Explorer 클립보드에 파일을 복사하여 애플리케이션에 붙여넣습니다.
  • 애플리케이션에서 휴지통으로 파일 끌기

이러한 시나리오 및 기타 시나리오를 처리하는 방법에 대한 자세한 내용은 셸 데이터 전송 시나리오 처리를 참조하세요. 이 문서에서는 Shell 데이터 전송의 일반적인 원칙에 중점을 둡니다.

Windows는 애플리케이션이 셸 데이터를 전송하는 두 가지 표준 방법을 제공합니다.

  • 사용자가 하나 이상의 파일과 같은 셸 데이터를 클립보드에 잘라내거나 복사합니다. 다른 애플리케이션은 클립보드에서 데이터를 검색합니다.
  • 사용자가 원본 애플리케이션에서 데이터를 나타내는 아이콘을 끌어 대상 소유 창에 아이콘을 삭제합니다.

두 경우 모두 전송된 데이터는 데이터 개체에 포함됩니다. 데이터 개체는 IDataObject 인터페이스를 노출하는 COM(Component Object Model) 개체입니다. 개략적으로 모든 셸 데이터 전송이 따라야 하는 세 가지 필수 단계가 있습니다.

  1. 원본은 전송할 데이터를 나타내는 데이터 개체를 만듭니다.
  2. 대상은 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 받습니다.
  3. 대상은 IDataObject 인터페이스를 호출하여 데이터를 추출합니다.

클립보드와 끌어서 놓기 데이터 전송의 차이점은 주로 IDataObject 포인터가 원본에서 대상으로 전송되는 방식에 있습니다.

클립보드 데이터 전송

클립보드는 셸 데이터를 전송하는 가장 간단한 방법입니다. 기본 절차는 표준 클립보드 데이터 전송과 유사합니다. 그러나 데이터 자체가 아닌 데이터 개체에 대한 포인터를 전송하기 때문에 표준 클립보드 API 대신 OLE 클립보드 API를 사용해야 합니다. 다음 절차에서는 OLE 클립보드 API를 사용하여 클립보드를 사용하여 셸 데이터를 전송하는 방법을 간략하게 설명합니다.

  1. 데이터 원본은 데이터를 포함할 데이터 개체를 만듭니다.
  2. 데이터 원본은 OleSetClipboard를 호출하여 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 클립보드에 배치합니다.
  3. 대상은 OleGetClipboard 를 호출하여 데이터 개체의 IDataObject 인터페이스에 대한 포인터를 검색합니다.
  4. 대상은 IDataObject::GetData 메서드를 호출하여 데이터를 추출합니다.
  5. 일부 Shell 데이터 전송에서는 대상에서 데이터 개체의 IDataObject::SetData 메서드를 호출하여 데이터 전송 결과에 대한 피드백을 데이터 개체에 제공해야 할 수도 있습니다. 이 유형의 작업에 대한 예제 는 최적화된 이동 작업 처리를 참조하세요.

데이터 전송 끌어서 놓기

구현하는 것이 다소 복잡하지만 끌어서 놓기 데이터 전송은 클립보드에 비해 몇 가지 중요한 이점이 있습니다.

  • 끌어서 놓기 전송은 간단한 마우스 이동으로 수행할 수 있으므로 클립보드보다 작업을 더 유연하고 직관적으로 사용할 수 있습니다.
  • 끌어서 놓기에서는 사용자에게 작업의 시각적 표현을 제공합니다. 사용자가 원본에서 대상으로 이동할 때 아이콘을 따를 수 있습니다.
  • 끌어서 놓기는 데이터를 사용할 수 있을 때 대상에 알립니다.

끌어서 놓기 작업도 데이터 개체를 사용하여 데이터를 전송합니다. 그러나 드롭 소스는 클립보드 전송에 필요한 것 이상의 기능을 제공해야 합니다.

  • 또한 드롭 소스는 IDropSource 인터페이스를 노출하는 개체를 만들어야 합니다. 시스템은 IDropSource 를 사용하여 작업이 진행되는 동안 원본과 통신합니다.
  • 끌어서 놓기 데이터 개체는 커서 이동을 추적하고 데이터 개체를 나타내는 아이콘을 표시합니다.

또한 드롭 대상은 클립보드 전송을 처리하는 데 필요한 것보다 더 많은 기능을 제공해야 합니다.

  • 놓기 대상은 IDropTarget 인터페이스를 노출해야 합니다. 커서가 대상 창 위에 있는 경우 시스템은 IDropTarget 을 사용하여 대상에 커서 위치와 같은 정보를 제공하고 데이터가 삭제될 때 이를 알립니다.
  • 놓기 대상은 RegisterDragDrop을 호출하여 시스템에 등록해야 합니다. 이 함수는 대상 창에 대한 핸들과 대상 애플리케이션의 IDropTarget 인터페이스에 대한 포인터를 시스템에 제공합니다.

참고

끌어서 놓기 작업의 경우 애플리케이션은 CoInitialize가 아닌 OleInitialize를 사용하여 COM을 초기화해야 합니다.

 

다음 절차에서는 일반적으로 끌어서 놓기를 사용하여 셸 데이터를 전송하는 데 사용되는 필수 단계를 간략하게 설명합니다.

  1. 대상은 RegisterDragDrop 을 호출하여 시스템에 IDropTarget 인터페이스에 대한 포인터를 제공하고 창을 놓기 대상으로 등록합니다.
  2. 사용자가 끌어서 놓기 작업을 시작하면 원본은 데이터 개체를 만들고 DoDragDrop을 호출하여 끌기 루프를 시작합니다.
  3. 커서가 대상 창 위에 있으면 시스템에서 대상의 IDropTarget 메서드 중 하나를 호출하여 대상에 알립니다. 커서가 대상 창에 들어가면 시스템에서 IDropTarget::D ragEnter 를 호출하고, 커서가 대상 창을 통과할 때 IDropTarget::D ragOver 를 호출합니다. 두 방법 모두 현재 커서 위치와 Ctrl 또는 Alt와 같은 키보드 한정자 키의 상태를 사용하여 놓기 대상을 제공합니다. 커서가 대상 창을 벗어나면 시스템은 IDropTarget::D ragLeave를 호출하여 대상에 알립니다. 이러한 메서드가 반환되면 시스템은 IDropSource 인터페이스를 호출하여 반환 값을 원본에 전달합니다.
  4. 사용자가 마우스 단추를 놓아 데이터를 삭제하면 시스템에서 대상의 IDropTarget::D rop 메서드를 호출합니다. 메서드의 매개 변수 중에는 데이터 개체의 IDataObject 인터페이스에 대한 포인터가 있습니다.
  5. 대상은 데이터 개체의 IDataObject::GetData 메서드를 호출하여 데이터를 추출합니다.
  6. 일부 Shell 데이터 전송에서는 대상에서 데이터 개체의 IDataObject::SetData 메서드를 호출하여 데이터 전송 결과에 대한 피드백을 원본에 제공해야 할 수도 있습니다.
  7. 대상이 데이터 개체로 완료되면 IDropTarget::D rop에서 반환됩니다. 시스템은 원본의 DoDragDrop 호출을 반환하여 데이터 전송이 완료되었음을 원본에 알립니다.
  8. 특정 데이터 전송 시나리오에 따라 원본은 DoDragDrop 에서 반환된 값 및 대상에 의해 데이터 개체에 전달되는 값에 따라 추가 작업을 수행해야 할 수 있습니다. instance 경우 파일이 이동되면 원본에서 이러한 값을 검사 원본 파일을 삭제해야 하는지 여부를 결정해야 합니다.
  9. 원본은 데이터 개체를 해제합니다.

위에서 설명한 절차는 셸 데이터 전송에 적합한 일반 모델을 제공하지만 Shell 데이터 개체에 포함될 수 있는 다양한 유형의 데이터가 있습니다. 애플리케이션에서 처리해야 할 수 있는 다양한 데이터 전송 시나리오도 있습니다. 각 데이터 형식 및 시나리오에는 절차의 세 가지 주요 단계에 대해 다소 다른 접근 방식이 필요합니다.

  • 원본이 셸 데이터를 포함하도록 데이터 개체를 생성하는 방법입니다.
  • 대상이 데이터 개체에서 Shell 데이터를 추출하는 방법
  • 원본이 데이터 전송 작업을 완료하는 방법.

Shell 데이터 개체는 원본이 Shell 데이터 개체를 생성하는 방법과 해당 데이터 개체를 대상에서 처리할 수 있는 방법에 대한 일반적인 설명을 제공합니다. 셸 데이터 전송 시나리오 처리에서는 여러 일반적인 셸 데이터 전송 시나리오를 처리하는 방법을 자세히 설명합니다.