西贝斯特招聘:窗口截图(二)
来源:百度文库 编辑:九乡新闻网 时间: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
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
窗口截图(二)
10种截图法(适合各种窗口)
10种截图方法(适合各种窗口)
10种屏幕截图方法(适合各种窗口)!
适合各种窗口的10种屏幕截图方法
10种屏幕截图方法(适合各种窗口).
10种屏幕截图方法(适合各种窗口)
110种屏幕截图方法(适合各种窗口)
10种屏幕截图方法(适合各种窗口)
10种屏幕截图方法(适合各种窗口
10种屏幕截图方法(适合各种窗口)2
10种屏幕截图方法(适合各种窗口)好东西
适合各种窗口的10种屏幕截图方法
10种屏幕截图方法(适合各种窗口) 2
10种屏幕截图方法 (适合各种窗口)
10种屏幕截图方法(适合各种窗口)000
z10种屏幕截图方法(适合各种窗口)
10种屏幕截图方法(适合各种窗口)。
10种屏幕截图方法(适合各种窗口)--
10种屏幕截图方法(适合各种窗口)
窗口。。。
视频截图
如何截图
简单截图