窗口截图

转载 2013年12月05日 15:35:23

窗口截图,可以获取遮挡窗口完整的图像,并保存到bmp文件中去。主要用到的函数中PrintWindow,VC6不支持该函数,请使用VS2008或vs2010来编译。其它需求如平台要求请参考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"));

}

相关文章推荐

[OpenCV]在显示窗口中截图

介绍使用OpenCV实现简单的截图功能。首先阐述实现此功能的基本步骤,然后给出实现代码,最后贴出实验结果和一点点评。...

关于AERO或WB主题等半透明窗口无法截图的解决

最近试过几套截图软件,发现其中有些无法实现对半透明窗口或主题的图片截取,包括早期版本的QQ截图工具也无法截取,于是打算写一个简单抓屏函数的来测试下,以下采用Win32 API方式编写:HBITMAP ...
  • ncistcn
  • ncistcn
  • 2011年01月17日 12:48
  • 1148

窗口截图

分别调用windows api函数及CVI自带函数,完成对GRAPH界面的截图

(转)QQ截图时窗口自动识别的原理

新版的QQ在截图时加入了窗口自动识别的功能,能根据鼠标的位置自动画出下面窗口的轮廓。今天有人在论坛上问起这个问题,下面我们来探讨这个功能的实现原理。 首先我们要明白截图软件的基本原理,截图时实际...
  • gxj1680
  • gxj1680
  • 2012年08月30日 15:59
  • 1326

C# 实现窗口截图

C# 实现窗口截图注意要自己添加必要的引用哦 using System; using System.Collections.Generic; using System.Linq; using S...

[转]Ubuntu使用 gnome-screenshot 截图命令来截取屏幕、窗口或指定区

在Ubuntu系统下,当有需要截图时一般会直接按键盘上的PrtScn SysRq键或者Ctrl+PrtScn键截取当前窗口,但最近发现,在顶栏menu打开的状态下是无法用这种方法截屏的,菜单弹出时按P...

窗口截图,然后再使用Graphic类的方法剪裁

/// /// 提供全屏和指定窗口的截图 以及保存为文件的类 /// public class ScreenCapture ...

窗口截图程序双模式

  • 2014年06月13日 14:01
  • 4.21MB
  • 下载

QT截图非顶层窗口的画面(获取窗口句柄)

我们知道QT里截图的代码很简单,很多例子都是截取桌面,或截取整个屏幕。 那如果要截取指定窗口的画面呢?即使该窗口不在桌面最顶层显示。我们也能截到它的图片吗? 当然可以,只要我们拿到该窗口的句柄就可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗口截图
举报原因:
原因补充:

(最多只允许输入30个字)