西贝斯特招聘:窗口截图(二)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 00:29:29
窗口截图,可以获取遮挡窗口完整的图像,并保存到bmp文件中去。主要用到的函数中PrintWindow,VC6不支持该函数,请使用VS2008来编译。其它需求如平台要求请参考MSDN文档。view plaincopy to clipboardprint?
01.void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)  
02.{  
03.    HDC hDC = ::GetWindowDC(hWnd);  
04.    ASSERT(hDC);  
05.      
06.    HDC hMemDC = ::CreateCompatibleDC(hDC);  
07.    ASSERT(hMemDC);  
08.      
09.    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.   CaptureWindow(hWnd, _T("F:\\12.bmp"));  
71.} 
void 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);
 ::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);
}// 调用方法
HWND hWnd = ::FindWindow(NULL, _T("XXX"));
if(hWnd)
{
   CaptureWindow(hWnd, _T("F:\\12.bmp"));
}  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/VisualEleven/archive/2011/02/25/6206715.aspx