2013-08-10 10 views
2

BitBlt을 통해 화면 영역을 캡처하는 프로그램이 있습니다. 오늘 테스트를 진행하면서 화면 영역에 Windows Media Player의 일부가 포함되어있을 때 회색 부분이 있다는 것을 알게되었습니다. 나머지 영역은 비트 맵에 성공적으로 복사됩니다.Win32 C++ 프로그래밍에서 Windows Media Player가 포함 된 화면 영역을 복사하려면 BitBlt()를 어떻게 수행합니까?

여기서 I 화면의 섹션을 캡처하는 데 사용하는 코드 단편이다 :

HDC hdc = ::GetDC(NULL); // get the desktop device context 
    HDC hDest = CreateCompatibleDC(hdc); // create a device context to use 

    // set the height and width of the region 
    int height = 800; 
    int width = 600; 

    // create a bitmap 
    HBITMAP hbDesktop = CreateCompatibleBitmap(hdc, width, height); 

    // use the previously created device context with the bitmap 
    SelectObject(hDest, hbDesktop); 

    // copy from the desktop device context (x=100,y=100) to the bitmap device context 
    BitBlt(hDest, 0, 0, width, height, hdc, 100, 100, SRCCOPY); 

이 코드는 스크린의 포인트 (100, 100)에서 시작하여 크기 800 × 600의 화면 영역을 캡처한다.

미디어 플레이어에서이 지역의 어딘가에서 동영상을 재생할 때 출력되는 비트 맵에 들어가면 동영상 플레이어의 콘텐츠 대신 회색 영역이 표시됩니다.

동영상 플레이어가 포함되어있는 경우 BitBlt에 화면 영역이 생길 수 있습니까? Media Player가 다른 Windows 응용 프로그램과 다르게 화면에 내용을 표시하기 때문입니까?

답변

1

불가능합니다. 미디어 플레이어 (특히 Windows Media Player)는 비디오 카드를 사용하여 CPU와 독립적으로 비디오를 그리거나 비디오 스트림을 디코딩합니다. 이미지는 주 메모리에도 없습니다. DRM도 여기에 적용됩니다.

당신은

BitBlt(hDest, 0, 0, width, height , hdc, 100, 100, SRCCOPY | CAPTUREBLT); 

어떤 계층 창을 캡처하는 시도 할 수 있지만,이 작동하도록 보장 할 수 없습니다.

+0

샘플 동영상을 재생하는 윈도우 미디어 플레이어를 (Alt-PrtScrn) 캡처 할 수 있으므로 Alt-PrtScrn을 사용하면 화면 영역을'BitBlt '할 수 있습니까? 아니면 뭔가 특별한 일을하는 Alt-PrtScrn입니까? –

+0

와우 그게 재미 있어요. 운영 체제가 그대로 화면을 포함하는 버퍼를 가지고 있다고 생각했습니다. – bodacydo

+0

가끔 있습니다. 그러나 비디오 플레이어의 경우, 미디어 플레이어 데이터가 그래픽 카드에만 여러 번 존재합니다 (그리고 OS는 그래픽 카드에 오버레이를 수행 할 위치를 알려줍니다). OS 버퍼는 (컬러 키) 오버레이 영역만을 갖는다. –