2010-01-27 4 views
3

자녀가있는 메인 창이 있습니다. 스크린 샷을 프로그래밍 방식으로 가져 와서 메인 윈도우에 다시 그려야합니다.OpenGL을 실행중인 하위 창의 캡쳐 화면 얻기 (Windows)

HDC hDC = GetWindowDC(hWnd); 
HDC memDC = CreateCompatibleDC(hDC); 
HBITMAP memBM = CreateCompatibleBitmap(hDC, Width, Height); 
HBITMAP OldBM = (HBITMAP)::SelectObject(memDC, memBM); 
BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY); 
int Bpp = GetDeviceCaps(hDC,BITSPIXEL); 
int size = Bpp/8 * (Width * Height); 
BYTE *lpBits = new BYTE[size]; 
GetBitmapBits(memBM, size, lpBits); 

그러나이 대신 그냥 OGL이 있어야하는데 렌더링 영역에서 빈을 그립니다, 자식 윈도우의 OpenGL을 부분을 캡처하지 않습니다 나는이 작업을 수행하는 방법이다.

답변

0

비디오를 캡처하고 비디오가 있던 검은 색 영역을 얻으려고 몇 년 전에 비슷한 문제가 있었음을 기억합니다. 비디오 드라이버의 하드웨어 가속 설정을 줄이면 (XP에서 : 바탕 화면> 등록 정보> 설정> 고급> 문제 해결을 마우스 오른쪽 단추로 클릭하십시오.)

Blank Screenshots In Vista and Win7 when gaming

Saving a screenshot of a window using C#, WPF, and DWM

+0

원본 창이 자식 인 경우 DWM 축소판을 사용하여이 작업을 수행 할 수 없습니다. 나는 좌절한다. –

0

아마도 NQR을,하지만 당신은 비트 맵으로 장면을 렌더링 할 수 있고 :

코드 기반 솔루션에 관해서는

, 다음 이전 게시물을 참조 할 수 있습니다 빈 공간에 넣으십시오.

+0

모르겠지만 어쨌든 자식 응용 프로그램을 제어 할 수 없으므로 시도 할 수 없습니다. 당신은 비트 맵을 렌더링 할 수 있어야한다. 하지만 OGL 창은 단지 일부 응용 프로그램이라고했습니다. –

0

나는 당신이 승리의 플랫폼이라고 생각한다.

자식 창에 대한 소스 코드가 없어도 비트 맵으로 렌더링 할 수있는 것.

  1. 먼저
  2. (... 그래서 수백 처리가) 승리의 거의 모든 창이기 때문에
    • 올바른 핸들 검색이 매우 까다 롭습니다 자식 창에 올바른 핸들를 얻을 수
    • 비트 맵 생성
    • 스크린 샷 창의 렌더링/장치 컨텍스트 핸들을 비트 맵으로 변경합니다.
      • 모든 창이 그렇게 할 수있는 것은 아닙니다.
    • 힘은
      • 이 최소화/승리 또는 뭔가
    • 저장 새 비트 맵을 복원 칠
    • 당신의 screenshoted 창/장치 컨텍스트를 렌더링 복원합니다.

이 매우 안정적 과정이 아니다주의 (상황 변화를 처리하는 동안 OpenGL은 충돌을 할 수 있습니다) 어떤 경우에는 당신도

더 안전한 데스크탑 그 자체를 스크린 샷입니다 컨텍스트 핸들을 변경할 수 없습니다./해제 컨텍스트 또는 승리를 생성/취득하지

TCanvas *scr=new TCanvas(); 
scr->Handle=GetDC(GetDesktopWindow()); 
// copy scr to your bitmap (do not forget to resize bitmap) 

경고가 너무 자주 처리의 때문에 약간의 버그가 더 좋은 방법은 한 번 핸들을 얻을 아무도 창을 닫없는 희망이다 (함수가 올바른 처리기 값을 반환 중지 때때로 WINAPI). ..아이가 새 처리기를 얻을시기를 정확히 알고 있음) IsWindow() 함수에서도 마찬가지입니다. 더 많은 정보를 들어

를 살펴 :

0
의 OpenGL은 계층화 된 컨텍스트에 렌더링 될 수

; 시도해보십시오

BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY | CAPTUREBLT); 

대신에보십시오.

관련 문제