窗口截图,可以获取遮挡窗口完整的图像,并保存到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"));
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。