추적 창 변경 내용
WNDOBJ를 통해 디바이스 드라이버에서 다중 모니터 시스템의 변경 내용을 포함하여 창에 대한 변경 내용을 추적할 수 있습니다. WNDOBJ는 창의 위치, 크기 및 표시되는 클라이언트 영역에 대한 정보를 포함하는 드라이버 수준 창 개체입니다. 즉, 애플리케이션 창에 해당하는 WNDOBJ를 만들어 드라이버가 해당 창의 크기, 위치 및 클라이언트 지역 변경 내용을 추적할 수 있습니다.
애플리케이션은 Win32 API를 사용하여 디바이스 드라이버에서 구현하는 WNDOBJ_SETUP 기능에 액세스합니다. Win32 ExtEscape 함수를 통해 액세스 권한을 얻습니다. GDI는 iEsc 값에 대한 WNDOBJ_SETUP 사용하여 디바이스 드라이버에서 구현한 DrvEscape를 사용하여 디바이스 드라이버에 이 이스케이프 호출을 전달합니다.
애플리케이션에서 ExtEscape(hdc, WNDOBJ_SETUP,... 호출 ) 을 입력 버퍼를 통해 애플리케이션에서 만든 창( CreateWindow 또는 해당하는 Win32 함수로 생성됨)에 핸들을 드라이버에 전달합니다. 드라이버가 창을 추적하는 경우 ExtEscape 호출의 컨텍스트 내에서 EngCreateWnd를 호출하여 지정된 창에 대한 WNDOBJ 구조를 만듭니다. 이 시점부터 해당 창에 대한 모든 변경 내용이 드라이버에 전달됩니다.
드라이버는 다음과 유사한 방식으로 ExtEscape 호출을 처리해야 합니다.
ULONG DrvEscape(
SURFOBJ *pso,
ULONG iEsc,
ULONG cjIn,
PVOID pvIn,
ULONG cjOut,
PVOID pvOut)
{
WNDOBJ *pwo;
WNDDATA *pwd;
if (iEsc == WNDOBJ_SETUP)
{
pwo = EngCreateWnd(pso,*((HWND *)pvIn),&DrvVideo,
WO_RGN_CLIENT, 0);
// Allocate space for caching client rects. Remember the pointer
// in the pvConsumer field.
pwd = EngAllocMem(0, sizeof(WNDDATA), DRIVER_TAG);
WNDOBJ_vSetConsumer(pwo,pwd);
// Update the rectangle list for this wndobj.
vUpdateRects(pwo);
return(1);
}
}
창 개체를 만들면 특수 창 리소스를 잠그므로 DrvEscape 또는 DrvSetPixelFormat의 WNDOBJ_SETUP 이스케이프 컨텍스트에서만 EngCreateWnd를 호출해야 합니다.
EngCreateWnd 함수는 여러 드라이버의 창 추적을 지원합니다. EngCreateWnd를 통해 각 드라이버는 GDI가 해당 창에 대한 변경 내용을 호출하는 고유한 콜백 루틴을 식별합니다. 예를 들어 이 기능을 사용하면 라이브 비디오 드라이버가 OpenGL 창에 대한 변경 내용을 추적하는 동안 라이브 비디오 창의 변경 내용을 추적할 수 있습니다.
DrvSetPixelFormat 또는 ExtEscape에서 새 WNDOBJ를 만든 경우 GDI는 최신 창 상태의 드라이버로 다시 호출합니다. 또한 GDI는 WNDOBJ에서 참조하는 창이 제거될 때 드라이버에 다시 호출합니다.
가속기로서 드라이버는 WNDOBJ 구조의 공용 멤버에 액세스할 수 있습니다.
창 변경 내용 추적에는 WNDOBJ 구조를 지원하기 위해 제공되는 세 가지 콜백 함수가 포함됩니다. 표시되는 클라이언트 지역은 WNDOBJ_cEnumStart 호출하고 콜백 함수를 WNDOBJ_bEnum 열거될 수 있습니다. 드라이버는 WNDOBJ_vSetConsumer 콜백 함수를 호출하여 자체 데이터를 WNDOBJ와 연결할 수 있습니다.