클립보드 작업

데이터를 잘라내거나 복사하거나 붙여넣을 때 창에서 클립보드를 사용해야 합니다. 창은 잘라내기 및 복사 작업을 위해 클립보드에 데이터를 배치하고 붙여넣기 작업을 위해 클립보드에서 데이터를 검색합니다. 다음 섹션에서는 이러한 작업 및 관련 문제에 대해 설명합니다.

데이터를 클립보드에 배치하거나 클립보드에서 데이터를 검색하려면 먼저 OpenClipboard 함수를 사용하여 클립보드열어야 합니다. 한 번에 하나의 창만 클립보드를 열 수 있습니다. 클립보드가 열려 있는 창을 확인하려면 GetOpenClipboardWindow 함수를 호출합니다. 완료되면 CloseClipboard 함수를 호출하여 창에서 클립보드닫아야 합니다.

이 섹션에서 설명하는 항목은 다음과 같습니다.

잘라내기 및 복사 작업

클립보드에 정보를 배치하기 위해 창은 먼저 EmptyClipboard 함수를 사용하여 이전 클립보드 콘텐츠를 지웁니다. 이 함수는 WM_DESTROYCLIPBOARD 메시지를 이전 클립보드 소유자에게 보내고, 클립보드의 데이터와 연결된 리소스를 해제하고, 클립보드가 열려 있는 창에 클립보드 소유권을 할당합니다. 클립보드를 소유하는 창을 확인하려면 GetClipboardOwner 함수를 호출합니다.

클립보드를 비운 후 창은 데이터를 클립보드에 가능한 한 많은 클립보드 형식으로 배치하고 가장 설명이 적은 클립보드 형식에서 가장 설명이 적은 형식으로 정렬합니다. 각 형식에 대해 창은 SetClipboardData 함수를 호출하여 형식 식별자와 전역 메모리 핸들을 지정합니다. 메모리 핸들은 NULL일 수 있으며, 이는 창이 요청에 따라 데이터를 렌더링함을 나타냅니다. 자세한 내용은 지연 렌더링을 참조 하세요.

붙여넣기 작업

클립보드에서 붙여넣기 정보를 검색하기 위해 창에서 먼저 검색할 클립보드 형식을 결정합니다. 일반적으로 창은 EnumClipboardFormats 함수를 사용하여 사용 가능한 클립보드 형식을 열거하고 인식하는 첫 번째 형식을 사용합니다. 이 메서드는 데이터가 클립보드에 배치되었을 때 우선 순위 집합에 따라 사용 가능한 최상의 형식을 선택합니다.

또는 창에서 GetPriorityClipboardFormat 함수를 사용할 수 있습니다. 이 함수는 지정된 우선 순위에 따라 사용 가능한 최상의 클립보드 형식을 식별합니다. 하나의 클립보드 형식만 인식하는 창은 IsClipboardFormatAvailable 함수를 사용하여 해당 형식을 사용할 수 있는지 여부를 결정할 수 있습니다 .

사용할 클립보드 형식을 결정한 후 창에서 GetClipboardData 함수를 호출합니다. 이 함수는 지정된 형식의 데이터를 포함하는 전역 메모리 개체에 핸들을 반환합니다. 창을 통해 데이터를 검사하거나 복사하기 위해 메모리 개체를 잠글 수 있습니다. 그러나 창은 개체를 해제하거나 오랜 시간 동안 잠긴 상태로 두면 안 됩니다.

클립보드 소유권

클립보드 소유자는 클립보드의 정보와 연결된 창입니다. 창은 클립보드에 데이터를 배치할 때, 특히 EmptyClipboard 함수를 호출 할 때 클립보드 소유자가 됩니다. 클립보드 소유자가 닫혀 있거나 다른 창이 클립보드를 비울 때까지 창이 다시 기본.

클립보드를 비우면 클립보드 소유자가 WM_DESTROYCLIPBOARD 메시지를 받습니다. 창에서 이 메시지를 처리할 수 있는 몇 가지 이유는 다음과 같습니다.

  • 하나 이상의 클립보드 형식의 렌더링이 지연되었습니다. WM_DESTROYCLIPBOARD 메시지에 대한 응답으로 창은 요청에 따라 데이터를 렌더링하기 위해 할당한 리소스를 해제할 수 있습니다. 데이터 렌더링에 대한 자세한 내용은 지연 렌더링을 참조 하세요.
  • 창에서 데이터를 클립보드에 프라이빗 클립보드 형식으로 배치했습니다. 클립보드가 비워지면 시스템에서 프라이빗 클립보드 형식에 대한 데이터를 해제하지 않습니다. 따라서 클립보드 소유자는 WM_DESTROYCLIPBOARD 메시지를 받으면 데이터를 해제해야 합니다. 프라이빗 클립보드 형식에 대한 자세한 내용은 클립보드 형식을 참조 하세요.
  • 창은 CF_OWNERDISPLAY 클립보드 형식을 사용하여 데이터를 클립보드에 배치했습니다. WM_DESTROYCLIPBOARD 메시지에 대한 응답으로 창은 클립보드 뷰어 창에 정보를 표시하는 데 사용한 리소스를 해제할 수 있습니다. 이 대체 형식에 대한 자세한 내용은 소유자 표시 형식을 참조 하세요.

지연된 렌더링

클립보드에 클립보드 형식을 배치하는 경우 데이터가 필요할 때까지 창에서 해당 형식의 데이터 렌더링을 지연할 수 있습니다. 이렇게 하려면 애플리케이션에서 SetClipboardData 함수의 hData 매개 변수에 대해 NULL 지정할 수 있습니다. 이는 애플리케이션이 여러 클립보드 형식을 지원하는 경우 유용하며, 그 중 일부 또는 전부는 렌더링하는 데 시간이 많이 걸립니다. NULL 핸들을 전달하면 창은 필요한 경우에만 복잡한 클립보드 형식을 렌더링합니다.

창에서 클립보드 형식 렌더링이 지연되는 경우 클립보드 소유자인 한 요청 시 형식을 렌더링하도록 준비해야 합니다. 렌더링되지 않은 특정 형식에 대한 요청을 받으면 시스템에서 클립보드 소유자 에게 WM_RENDERFORMAT 메시지를 보냅니다. 이 메시지를 받으면 창에서 SetClipboardData 함수를 호출하여 요청된 형식으로 클립보드에 전역 메모리 핸들을 배치해야 합니다.

애플리케이션은 WM_RENDERFORMAT 메시지에 대한 응답으로 SetClipboardData를 호출하기 전에 클립보드를 열지 않아야 합니다. 클립보드를 열 필요가 없으며, 현재 렌더링할 형식을 요청한 애플리케이션에서 클립보드를 열어 두기 때문에 클립보드를 열지 않습니다.

클립보드 소유자가 제거되고 일부 또는 모든 클립보드 형식의 렌더링이 지연된 경우 WM_RENDERALLFORMATS 메시지를 받습니다. 이 메시지를 받으면 창에서 클립보드를 열고 GetClipboardOwner 함수가 있는 클립보드 소유자임을 검사 다음, 제공하는 모든 클립보드 형식에 대해 유효한 메모리 핸들을 클립보드에 배치해야 합니다. 이렇게 하면 클립보드 소유자가 제거된 후 이러한 형식을 다시 사용할 수 기본.

WM_RENDERFORMAT 경우와 달리 WM_RENDERALLFORMATS 응답하는 애플리케이션은 SetClipboardData를 호출하여 전역 메모리 핸들을 클립보드에 배치하기 전에 클립보드를 열어야 합니다.

WM_RENDERALLFORMATS 메시지에 대한 응답으로 렌더링되지 않는 클립보드 형식은 다른 애플리케이션에서 사용할 수 없게 되고 클립보드 함수에 의해 더 이상 열거되지 않습니다.

지연된 렌더링 지침

지연된 렌더링은 애플리케이션이 요청되지 않는 형식으로 클립보드 데이터를 렌더링하는 작업을 방지할 수 있도록 하는 성능 기능입니다. 그러나 지연된 렌더링을 사용하려면 고려해야 할 다음과 같은 절충 사항이 포함됩니다.

  • 지연된 렌더링을 사용하면 애플리케이션에 복잡성이 추가되므로 위에서 설명한 대로 두 개의 렌더링 창 메시지를 처리해야 합니다.
  • 지연된 렌더링을 사용하면 데이터를 렌더링하는 데 충분한 시간이 소요되어 사용자에게 눈에 띄는 경우 애플리케이션에서 UI 응답성을 유지하는 옵션이 손실됩니다. 렌더링이 지연되면 데이터가 결국 필요한 경우 위에서 설명한 대로 렌더링 창 메시지를 처리하는 동안 창에서 데이터를 렌더링해야 합니다. 따라서 데이터를 렌더링하는 데 시간이 많이 걸리는 경우 렌더링 창 메시지를 처리하는 동안 다른 창 메시지를 처리할 수 없으므로 렌더링이 발생하는 동안 애플리케이션이 눈에 띄게 응답하지 않을 수 있습니다(중단). 지연된 렌더링을 사용하지 않는 애플리케이션은 렌더링이 발생하는 동안 UI 응답을 유지하기 위해 백그라운드 스레드에서 데이터를 렌더링하도록 선택할 수 있습니다. 지연된 렌더링을 사용할 때 사용할 수 없는 진행률 또는 취소 옵션을 제공할 수 있습니다.
  • 지연된 렌더링을 사용하면 데이터가 결국 필요한 경우 약간의 오버헤드가 추가됩니다. 지연 렌더링을 사용하는 경우 창은 처음에 NULL 핸들을 사용하여 SetClipboardData 함수를 호출하고, 나중에 데이터가 필요한 경우 창은 창 메시지에 응답하고 위에서 설명한 대로 렌더링된 데이터에 대한 핸들을 사용하여 SetClipboardData 함수를 두 번째로 호출해야 합니다. 결과적으로 데이터가 결국 필요한 경우 지연된 렌더링을 사용하면 창 메시지를 처리하고 SetClipboardData 함수를 두 번째로 호출하는 비용이 추가됩니다. 이 비용은 작지만 0은 아닙니다. 애플리케이션이 단일 클립보드 형식만 지원하고 데이터가 항상 요청되는 경우 지연된 렌더링을 사용하면 이 적은 양의 오버헤드가 추가됩니다(비용은 하드웨어에 따라 다르며 예상 시간은 10~100 마이크로초 사이). 그러나 데이터가 작으면 지연된 렌더링을 사용하는 오버헤드가 데이터 렌더링 비용을 초과할 수 있으므로 지연된 렌더링을 사용하여 성능을 향상시킬 수 있습니다. (테스트에서 이미 최종 형식인 데이터의 경우 지연된 렌더링을 사용하는 오버헤드는 데이터가 100KiB 이하인 경우 데이터를 클립보드에 복사하는 데 드는 비용을 지속적으로 초과했습니다. 이 테스트에는 데이터를 렌더링하는 데 드는 비용이 포함되지 않으며 렌더링된 후에만 복사합니다.)
  • 지연된 렌더링은 오버헤드에 추가되는 것보다 더 많은 시간을 절약하는 경우 순 성능 이점입니다. 지연된 렌더링의 오버헤드를 확인하기 위해 측정이 가장 좋지만 10~100 마이크로초는 예상값입니다. 각 클립보드 형식에 지연 렌더링을 사용하는 비용을 계산하려면 해당 형식으로 데이터를 렌더링하는 비용을 측정하고 해당 형식이 최종적으로 요청되는 빈도를 결정합니다(위에서 설명한 창 메시지에 따라). 데이터를 렌더링하는 데 드는 비용을 최종적으로 요청되지 않은 시간(클립보드를 비우거나 내용이 변경되기 전)을 곱하여 각 클립보드 형식에 대해 지연된 렌더링의 절감을 결정합니다. 지연된 렌더링은 비용 절감이 오버헤드 비용을 초과하는 경우 순 성능 이점입니다.
  • 구체적인 지침으로, 데이터가 렌더링 비용이 크게 드는 텍스트와 같은 단일 클립보드 형식만 지원하는 애플리케이션의 경우 데이터 크기가 4KiB 이하인 경우 데이터를 클립보드에 직접 배치하는 것이 좋습니다.

메모리 및 클립보드

GMEM_MOVEABLE 플래그와 함께 GlobalAlloc 함수를 사용하여 클립보드에 배치할 메모리 개체를 할당해야 합니다.

메모리 개체가 클립보드에 배치되면 해당 메모리 핸들의 소유권이 시스템으로 전송됩니다. 클립보드가 비워지고 메모리 개체에 다음 클립보드 형식 중 하나가 있으면 시스템에서 지정된 함수를 호출하여 메모리 개체를 해제합니다.

개체를 해제하는 함수 클립보드 형식
DeleteMetaFile
CF_DSPENHMETAFILE
CF_DSPMETAFILEPICT
CF_ENHMETAFILE
CF_METAFILEPICT
DeleteObject
CF_BITMAP
CF_DSPBITMAP
CF_PALETTE
GlobalFree
CF_DIB
CF_DIBV5
CF_DSPTEXT
CF_OEMTEXT
CF_TEXT
CF_UNICODETEXT
없음
CF_OWNERDISPLAY
클립보드가 CF_OWNERDISPLAY 개체를 비우면 애플리케이션 자체가 메모리 개체를 해제해야 합니다.