void CPrintClientBmpDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 HWND hWnd = ::FindWindow(NULL, _T("PrintClientBmp")); if(hWnd) { SaveHwndToBmpFile(hWnd, _T("D://12.bmp")); } } void CPrintClientBmpDlg::SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) { HDC hDC = ::GetWindowDC(hWnd); ASSERT(hDC); HDC hMemDC = ::CreateCompatibleDC(hDC); ASSERT(hMemDC); RECT rc; ::GetWindowRect(hWnd, &rc); HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top); ASSERT(hBitmap); HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap); //加载动态库 HINSTANCE hInst = LoadLibrary("User32.DLL"); if ( !hInst ) { FreeLibrary(hInst); return; } //定义一个函数指针的类型 typedef BOOL (WINAPI * MYFUNC)(HWND ,HDC ,UINT); MYFUNC fun = NULL; //获取函数 SetLayeredWindowAttributes fun = (MYFUNC)GetProcAddress(hInst,"PrintWindow"); if (!fun) { FreeLibrary(hInst); return ; } fun(hWnd, hMemDC, 0); FreeLibrary(hInst); //PrintWindow(hWnd, hMemDC, 0); BITMAP bitmap = {0}; ::GetObject(hBitmap, sizeof(BITMAP), &bitmap); BITMAPINFOHEADER bi = {0}; BITMAPFILEHEADER bf = {0}; CONST int nBitCount = 24; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bitmap.bmWidth; bi.biHeight = bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = nBitCount; bi.biCompression = BI_RGB; DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight; HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER)); LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS); try { CFile file; file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite); bf.bfType = 0x4d42; dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bf.bfSize = dwSize; bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER)); file.Write((BYTE*)lpbi, dwSize); file.Close(); } catch(CFileException* e) { e->ReportError(); e->Delete(); } GlobalUnlock(hDib); GlobalFree(hDib); ::SelectObject(hMemDC, hOldBmp); ::DeleteObject(hBitmap); ::DeleteObject(hMemDC); ::ReleaseDC(hWnd, hDC); } 后台截图 VC6.0下使用PrintWindow 需要 loadlibrary("User32.lib")