1 void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) 2 { 3 HDC hDC = ::GetWindowDC(hWnd); 4 ASSERT(hDC); 5 6 HDC hMemDC = ::CreateCompatibleDC(hDC); 7 ASSERT(hMemDC); 8 9 RECT rc; 10 ::GetWindowRect(hWnd, &rc); 11 12 HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top); 13 ASSERT(hBitmap); 14 15 HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap); 16 ::PrintWindow(hWnd, hMemDC, 0); 17 18 BITMAP bitmap = {0}; 19 ::GetObject(hBitmap, sizeof(BITMAP), &bitmap); 20 BITMAPINFOHEADER bi = {0}; 21 BITMAPFILEHEADER bf = {0}; 22 23 CONST int nBitCount = 24; 24 bi.biSize = sizeof(BITMAPINFOHEADER); 25 bi.biWidth = bitmap.bmWidth; 26 bi.biHeight = bitmap.bmHeight; 27 bi.biPlanes = 1; 28 bi.biBitCount = nBitCount; 29 bi.biCompression = BI_RGB; 30 DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight; 31 32 HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER)); 33 LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 34 *lpbi = bi; 35 36 ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS); 37 38 try 39 { 40 CFile file; 41 file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite); 42 bf.bfType = 0x4d42; 43 dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 44 bf.bfSize = dwSize; 45 bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 46 47 file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER)); 48 file.Write((BYTE*)lpbi, dwSize); 49 file.Close(); 50 } 51 catch(CFileException* e) 52 { 53 e->ReportError(); 54 e->Delete(); 55 } 56 57 GlobalUnlock(hDib); 58 GlobalFree(hDib); 59 60 ::SelectObject(hMemDC, hOldBmp); 61 ::DeleteObject(hBitmap); 62 ::DeleteObject(hMemDC); 63 ::ReleaseDC(hWnd, hDC); 64 } 65 66 // 调用方法 67 HWND hWnd = ::FindWindow(NULL, _T("XXX")); 68 if(hWnd) 69 { 70 SaveHwndToBmpFile(hWnd, _T("F://12.bmp")); 71 }