MFC 특정 윈도우 화면 캡쳐/미러링 기능

Develop2018. 11. 7. 10:35



윈도우 프로그래밍(MFC) 환경에서 특정 윈도우 화면을 캡쳐하거나 미러링하는 기능을 소개합니다. 이 기능은 특정 윈도우 화면을 자신이 제작한 프로그램에서 보여주거나 저장 및 녹화 할 때 사용됩니다. 또한 특정 화면을 인식하는 매크로 프로그램을 만들 때도 사용됩니다. 아래 소개할 코드는 기본형 코드입니다. 다양한 기능으로 확장하기 위해서는 코드를 조금만 응용하시면 됩니다. 



특정 윈도우 화면 캡쳐 함수 - WindowCapture

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
BOOL WindowCapture(HWND hTargetWnd)
{
    CRect rct;
    if (hTargetWnd)
        ::GetClientRect(hTargetWnd, &rct);
    else
        return FALSE;
 
    CRect rcClient;
    GetClientRect(&rcClient);
 
    HBITMAP hBitmap = NULL;
    HBITMAP hOldBitmap = NULL;
    BOOL bSuccess = FALSE;
 
    HDC hDC = ::GetDC(hTargetWnd);
    HDC hMemDC = ::CreateCompatibleDC(hDC);
    hBitmap = ::CreateCompatibleBitmap(hDC, rct.Width(), rct.Height());
 
    if (!hBitmap)
        return FALSE;
 
    hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);
 
    // 캡쳐한 윈도우 현재 클라이언트 화면 크기에 맞춰 그리기
    CClientDC dc(this);
    dc.SetStretchBltMode(COLORONCOLOR);
    dc.StretchBlt(00, rcClient.Width(), rcClient.Height(), CDC::FromHandle(hDC), 
        00, rct.Width(), rct.Height(), SRCCOPY);
 
    ::SelectObject(hMemDC, hOldBitmap);
    DeleteObject(hBitmap);
    ::DeleteDC(hMemDC);
    ::ReleaseDC(hTargetWnd, hDC);
 
    return bSuccess;
}
cs


WindowCapture 함수는 특정 타겟 윈도우(hTargetWnd)를 캡쳐하여 현재 화면 크기에 맞게 그려주는 함수입니다. 핵심은 타겟 윈도우의 DC객체를 취득하고 비트맵 이미지로 변환하여 출력해주는 원리 입니다. 만약 캡쳐한 비트맵이 현재 윈도우에서 그리지 않는 경우는 26번째 라인의 CClientDC를 사용하는 것이 아닌 그려줄 윈도우의 DC를 설정해 주시면 됩니다. 이 함수는 캡쳐 성공 시 TRUE, 실패 시 FALSE를 반환합니다.



WindowCapture 함수 사용법

1
2
3
4
5
6
CString strAppName = _T("캡쳐할 윈도우 이름");
CWnd * pWnd = FindWindow(NULL, strAppName);
if (pWnd)
{
    WindowCapture(pWnd->GetSafeHwnd());
}
cs


WindowCapture 함수 사용법은 간단합니다. 먼저 캡쳐할 윈도우의 이름을 CString 변수로 지정하고, FindWindow 함수를 통해 윈도우 핸들러를 얻습니다. 이 윈도우 핸들러를 위 코드와 같이 WindowCapture의 파라미터로 넣어주시면 됩니다. 추가적으로 OnTimer와 같은 함수를 이용해 매 프레임마다 캡쳐하도록 지정하면, 특정 윈도우 미러링 효과를 보실 수 있습니다.


작성자

Posted by GLORY PAPA

관련 글

댓글 영역