窗口截图(可指定HWND窗口句柄)
来源:互联网 发布:数据库序列如何创建 编辑:程序博客网 时间:2024/05/01 12:26
方法一
BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath){HWND hDesktop = ::GetDesktopWindow();ASSERT(hDesktop);if(NULL == hWnd){hWnd = hDesktop;}RECT rect;::GetWindowRect(hWnd, &rect);int nWidht = rect.right - rect.left;int nHeight = rect.bottom - rect.top;HDC hSrcDC = ::GetWindowDC(hWnd);ASSERT(hSrcDC);HDC hMemDC = ::CreateCompatibleDC(hSrcDC);ASSERT(hMemDC);HBITMAP hBitmap = ::CreateCompatibleBitmap(hSrcDC, nWidht, nHeight);ASSERT(hBitmap);HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);::BitBlt(hMemDC, 0, 0, nWidht, nHeight, hSrcDC, 0, 0, SRCCOPY);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, hOldBitmap);::DeleteObject(hBitmap);::DeleteDC(hMemDC);::ReleaseDC(hWnd, hSrcDC);return TRUE;}// 调用方法HWND hWnd = ::FindWindow(NULL, _T("XXX")); if(hWnd) { SaveHwndToBmpFile(hWnd, _T("F://12.bmp")); }
方法二
窗口截图,可以获取遮挡窗口完整的图像,并保存到bmp文件中去。主要用到的函数中PrintWindow,VC6不支持该函数,请使用VS2008来编译。其它需求如平台要求请参考MSDN文档。
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){ SaveHwndToBmpFile(hWnd, _T("F://12.bmp"));}
- 窗口截图(可指定HWND窗口句柄)
- 窗口截图(可指定HWND窗口句柄)
- 窗口截图(可指定HWND窗口句柄)
- 窗口截图(可指定HWND窗口句柄)
- win32 API窗口句柄 HWND
- 窗口句柄HWND和实例句柄HINSTANCE
- 句柄Hwnd 与 窗口Wnd的联系
- 获取控制台窗口的句柄(hWnd)
- 如何获取控制台窗口句柄 (HWND)
- 如何获取控制台窗口句柄 (HWND)
- 如何获取控制台窗口句柄 (HWND)
- mfc 根据窗口句柄(HWND)杀死进程
- pyQT指定窗口截图
- 如何获得窗口句柄(HWND )和改变窗口属性
- 如何获得窗口句柄(HWND )和改变窗口属性
- 进程句柄HANDLE获得进程主窗口的句柄HWND
- 关于有窗口句柄和无窗口句柄的截图
- void HighlightWindow( HWND hwnd, BOOL fDraw ) 高亮指定窗口
- 什么是异构计算?
- 莫言微博回应获诺奖:感谢网友肯定和批评-莫言-诺贝尔文学奖-微博
- 晨练照像两不误
- 关于异构计算
- Struts标签库详解,非常好的Struts标签详解(转载
- 窗口截图(可指定HWND窗口句柄)
- 开启新一片蓝海——异构计算完全解析
- java 转换xml json
- 异构平台对比(GPU FPGA DSP)
- 人老后才学摄影
- 再谈异构计算CPU+GPU
- 递归转换成非递归思路
- Dom4j下载及使用Dom4j读写XML简介
- char与int转化