Windows Confidential커서가 사라지는 경우

Raymond Chen

스크린샷을 만들기 위해 PrtSc 키를 눌렀을 때 커서가 잠시 깜박이는 것을 본 적이 있을 것입니다. 믿으실지 모르겠지만 사실 이 현상은 Windows XP의 페이드아웃 종료 화면에 반투명 창들이 포함되지 않는 것과 같은 이유 때문에 일어납니다.

이러한 반투명 창들은 계층화된 창이라고 하며 화면에서 픽셀을 읽을 때 BitBlt 함수는 보통 이 창들을 포함하지 않습니다. 반투명 창들까지 포함시키려면 CAPTUREBLT 플래그를 전달해야 하지요. 그렇게 하면 마우스 커서가 깜박이는 것도 보았을 것입니다. 왜 이런 것일까요?

예전에는 화면에서 다른 개체 “위에” 떠 있는 유일한 그래픽 개체는 오직 마우스 커서 뿐이었습니다. 처음에 시스템은 단색 마우스 커서만 지원했습니다. 이 커서는 소프트웨어에서 지원하지만 기막히게 좋은 비디오 카드의 경우 하드웨어 수준에서 지원하기도 했습니다.

비디오 카드에서 지원되는 커서를 사용하면 GDI(그래픽 장치 인터페이스)가 비디오 카드에게 비트맵과 마스크를 하나 전달하고는 다음과 같이 알려주지요. "자, 이건 마우스 커서다. 화면 위의 지정된 좌표에 이걸 겹치렴.” 사용자가 마우스를 움직이면 GDI는 비디오 카드에게 갱신된 좌표만 보내면 되고, 화면에서 이리저리 마우스의 픽셀을 움직이는 중노동은 비디오 카드가 수행하게 됩니다.

반면, 소프트웨어에서 지원되는 커서를 사용하는 경우 GDI는 프레임 버퍼에 커서 모양을 그려주기 전에 커서 밑의 픽셀을 저장하는 역할까지 담당해야 합니다. 그 과정은 다음과 같은 방식으로 이루어집니다. 사용자가 마우스를 움직이면 GDI는 직접 원래의 픽셀을 복구한 다음, 커서의 새로운 위치 밑에 있는 모든 픽셀을 저장한 후 그 새로운 위치에 커서를 그려줍니다.

하드웨어 커서의 경우 하드웨어가 커서의 오버레이를 수행하기 때문에 사실상 프레임 버퍼에는 마우스 커서의 픽셀이 존재하지 않습니다. 결국 프레임 버퍼에는 처음부터 마우스 커서의 픽셀들이 없으므로 BitBlt 함수는 실수로라도 이 픽셀들까지 뽑아올 우려 없이 그냥 프레임 버퍼로부터 픽셀을 복사해 올 수 있습니다.

반대로, 소프트웨어 커서를 사용할 경우 복사할 영역이 마우스 커서와 겹친다면 화면으로부터 BitBlt를 수행하기 전에 GDI는 반드시 화면에서 마우스 커서를 제거하는 작업을 해야만 합니다.

애니메이션 커서를 사용하는 경우 하드웨어 커서는 기대만큼의 역할을 하지 못하는데 이는 하드웨어 커서는 움직이지 않기 때문입니다. 따라서 애니메이션 커서는 소프트웨어적으로 구현됩니다.

좋습니다, 대단하네요. 하지만 이게 CAPTUREBLT와 무슨 상관이 있을까요? 잠시만요, 곧 설명하겠습니다.

Windows 2000에서는 소프트웨어 커서에 사용되던 화면 합성 메커니즘이 일반화되었기 때문에 이제 응용 프로그램들도 이를 이용할 수 있게 되었습니다. 이러한 의사 커서들을 이제는 계층화된 창이라고 부르게 되었습니다. 소프트웨어 커서와 마찬가지로 통상적인 의미에서 볼 때 이 계층화된 창들은 사실상 존재하지 않기 때문에 화면으로부터 BitBlt를 쓸 때는 계층화된 창이 나타나지 않게 됩니다. 커서와 계층화된 창의 픽셀들은 마지막 순간에 화면에 합성됩니다.

하지만 BitBlt를 통해 계층화된 창의 픽셀들까지 캡쳐하고 싶다면? 여기서 새로운 CAPTUREBLT 플래그가 작용하게 됩니다. 이 플래그를 사용하면 합성 엔진이 픽셀들을 합성한 후에 픽셀들이 캡처됩니다. Windows XP의 희미해지는 종료 화면을 만들어 내는 코드는 CAPTUREBLT를 전달하지 않기 때문에 계층화된 창이 나타나지 않습니다.

하지만 아직도 왜 커서가 깜박거리는지는 설명되지 않은 것 같군요. 사실은 이렇습니다. 마우스 커서도 그저 하나의 합성 개체니까 CAPTUREBLT 플래그에 의해 캡처됩니다. 스크린 캡처 동안 이런 일이 생기지 않도록 하기 위해 합성 엔진은 일단 커서를 숨기고 CAPTUREBLT 플래그에 따라 처리한 다음, 커서를 다시 표시해야 합니다.

응용 프로그램들이 Windows 2000 합성 엔진을 사용할 수 있게 됨으로써 커서는 이제 그 특별한 지위를 잃게 되었습니다. 한 바퀴 돌아 다시 원점으로 온 셈이군요. 옛 것이 좋다는 말처럼 지금은 프레임 버퍼 하나와 소프트웨어 커서 하나가 전부이던 시절로 돌아간 셈입니다.

Raymond ChenThe Old New Thing 웹 사이트와 동명의 저서(Addison-Wesley, 2007)에서 Windows의 역사와 Win32 프로그래밍, 그리고 신문 머리기사를 오독하는 방법에 대해 다루고 있습니다.