窗口截图

转载 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"));

}

C# 非顶端窗口截图 - 用于查找指定窗口并截图

panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡           Bitmap sourceBitmap = new Bitmap(400, 300);       ...
  • u013096568
  • u013096568
  • 2016年11月29日 21:15
  • 1913

重温 Win32 API ----- 截屏指定窗口并打印

朋友说在一个VC++6.0开发的项目中要加入打印窗口的功能,让帮忙写个代码供其调用。这么老的IDE当然不想碰了,而且也不喜欢MFC笨拙不清晰的封装,所以决定采用纯Win32 API,然后用C++类简单...
  • smstong
  • smstong
  • 2014年12月22日 17:12
  • 6538

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

我们知道QT里截图的代码很简单,很多例子都是截取桌面,或截取整个屏幕。 那如果要截取指定窗口的画面呢?即使该窗口不在桌面最顶层显示。我们也能截到它的图片吗? 当然可以,只要我们拿到该窗口的句柄就可...
  • liukang325
  • liukang325
  • 2016年12月10日 17:04
  • 1951

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

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

窗口截图

分别调用windows api函数及CVI自带函数,完成对GRAPH界面的截图
  • u014641885
  • u014641885
  • 2016年11月03日 15:02
  • 153

C# 实现窗口截图

C# 实现窗口截图注意要自己添加必要的引用哦 using System; using System.Collections.Generic; using System.Linq; using S...
  • xinke453
  • xinke453
  • 2012年02月16日 17:09
  • 893

[OpenCV]在显示窗口中截图

介绍使用OpenCV实现简单的截图功能。首先阐述实现此功能的基本步骤,然后给出实现代码,最后贴出实验结果和一点点评。...
  • bendanban
  • bendanban
  • 2015年03月08日 13:29
  • 6037

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

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

C# 如何截取当前程序窗口的截图

以下源代码内容转自 CSDN 论坛。 要想完成这个功能,首先要了解一下在C#中如何调用API(应用程序接口)函数。虽然在.Net框架中已经提供了许多类库,这些类库的功能也十分强大,但对于一些Wind...
  • sygdp21
  • sygdp21
  • 2013年12月31日 18:05
  • 696

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

在Ubuntu系统下,当有需要截图时一般会直接按键盘上的PrtScn SysRq键或者Ctrl+PrtScn键截取当前窗口,但最近发现,在顶栏menu打开的状态下是无法用这种方法截屏的,菜单弹出时按P...
  • wilschan0201
  • wilschan0201
  • 2017年06月15日 09:51
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗口截图
举报原因:
原因补充:

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