2010-03-19 2 views
3

.bmp 파일로 창을 캡처하기 위해 일부 C++ 코드를 작성했습니다.BitBlt가 테두리를 표시하지 않는 Win32 창 캡처

BITMAPFILEHEADER get_bitmap_file_header(int width, int height) 
{ 
BITMAPFILEHEADER hdr; 
memset(&hdr, 0, sizeof(BITMAPFILEHEADER)); 
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM" 
hdr.bfSize = 0;//sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (width * height * sizeof(int)); 
hdr.bfReserved1 = 0; 
hdr.bfReserved2 = 0; 
hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); 

return hdr; 
} 

BITMAPINFO get_bitmap_info(int width, int height) 
{ 
BITMAPINFO bmi; 
memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); 
//initialize bitmap header 
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biWidth = width; 
bmi.bmiHeader.biHeight = height; 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 4 * 8; 
bmi.bmiHeader.biCompression = BI_RGB; 
bmi.bmiHeader.biSizeImage = width * height * 4; 

return bmi; 
} 

void get_bitmap_from_window(HWND hWnd, int * imageBuff) 
{ 
HDC hDC = GetWindowDC(hWnd); 
SIZE size = get_window_size(hWnd); 
HDC hMemDC = CreateCompatibleDC(hDC); 
RECT r; 

HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy); 
HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBitmap); 

BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY); 
    //PrintWindow(hWnd, hMemDC, 0); 

BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy); 
GetDIBits(hMemDC, hBitmap, 0, size.cy, imageBuff, &bmi, DIB_RGB_COLORS); 

SelectObject(hMemDC, hOld); 
    DeleteDC(hMemDC); 
    ReleaseDC(NULL, hDC); 
} 

void save_image(HWND hWnd, char * name) 
{ 
int * buff; 
RECT r; 
SIZE size; 

GetWindowRect(hWnd, &r); 
size.cx = r.right-r.left; 
size.cy = r.bottom-r.top; 

buff = (int*)malloc(size.cx * size.cy * sizeof(int)); 

get_bitmap_from_window(hWnd, buff); 

BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy); 
BITMAPFILEHEADER hdr = get_bitmap_file_header(size.cx, size.cy); 

FILE * fout = fopen(name, "w"); 
fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), fout); 
fwrite(&bmi.bmiHeader, 1, sizeof(BITMAPINFOHEADER), fout); 
fwrite(buff, 1, size.cx * size.cy * sizeof(int), fout); 

fflush(fout); 
fclose(fout); 
free(buff); 
} 

XP에서는 작동하지만 Vista에서는 창 테두리가 투명합니다.

PrintWindow를 사용하면 성능상의 이유로 문제가 해결되지만 허용되지 않습니다.

테두리를 비 투명하게 만들기 위해 퍼포먼트 코드 변경 또는 설정이 있습니까?

답변

0

사용하는 대신 아래

BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY | CAPTUREBLT); 
관련 문제