首页 > 代码库 > 窗口截图(可指定HWND窗口句柄)(三篇文章)

窗口截图(可指定HWND窗口句柄)(三篇文章)

 

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

http://blog.csdn.net/visualeleven/article/details/6202796

http://blog.csdn.net/visualeleven/article/details/6206715

http://blog.csdn.net/visualeleven/article/details/6093484

 

窗口截图(可指定HWND窗口句柄)(三篇文章)