c++ 屏幕截图指定窗口句柄后台截图返回位图句柄
/根据窗口句柄后台截图保存成BMP位图文件并且显示到picture 控件上
void GetScreenBmp(HWND hwnd, int left, int top, int width, int height, CHAR* path)
{ HDC pDC;// 源DC
//判断是不是窗口句柄如果是的话不能使用GetDC来获取DC 不然截图会是黑屏
if (hwnd==::GetDesktopWindow())
{
pDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
}
else
{
pDC = ::GetDC(hwnd);//获取屏幕DC(0为全屏,句柄则为窗口)
}
int BitPerPixel = ::GetDeviceCaps(pDC, BITSPIXEL);//获得颜色模式
if (width == && height == )//默认宽度和高度为全屏
{
width = ::GetDeviceCaps(pDC, HORZRES); //设置图像宽度全屏
height = ::GetDeviceCaps(pDC, VERTRES); //设置图像高度全屏
}
HDC memDC;//内存DC
memDC = ::CreateCompatibleDC(pDC);
HBITMAP memBitmap, oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap = ::CreateCompatibleBitmap(pDC, width, height);
oldmemBitmap = (HBITMAP)::SelectObject(memDC, memBitmap);//将memBitmap选入内存DC
if (hwnd==::GetDesktopWindow())
{
BitBlt(memDC,, , width, height, pDC, left, top, SRCCOPY);//图像宽度高度和截取位置
}
else
{
bool bret = ::PrintWindow(hwnd, memDC, PW_CLIENTONLY);
if (!bret)
{
BitBlt(memDC, , , width, height, pDC, left, top, SRCCOPY);//图像宽度高度和截取位置
}
}
//以下代码保存memDC中的位图到文件
BITMAP bmp;
::GetObject(memBitmap, sizeof(BITMAP), &bmp);;//获得位图信息
FILE *fp;
fopen_s(&fp, path, "w+b");//图片保存路径和方式 BITMAPINFOHEADER bih = { };//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = ;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度 BITMAPFILEHEADER bfh = { };//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42; fwrite(&bfh, , sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bih, , sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
GetDIBits(memDC, (HBITMAP)memBitmap, , height, p,
(LPBITMAPINFO)&bih, DIB_RGB_COLORS);//获取位图数据
fwrite(p, , bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据
delete[] p;
fclose(fp);
HWND sBitHwnd = GetDlgItem(g_Hwnd, IDC_STATIC_IMG);
/*返回内存中的位图句柄 还原原来的内存DC位图句柄 不能直接用 memBitmap我测试好像是不行不知道为什么*/
HBITMAP oleImage = (HBITMAP)::SelectObject(memDC, oldmemBitmap);
oleImage = (HBITMAP)SendMessage(sBitHwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)oleImage);
#if 0
/*这种方法也能把位图显示到picture 控件上*/
HDC bitDc = NULL;
bitDc = ::GetDC(sBitHwnd);
BitBlt(bitDc, , , bmp.bmWidth, bmp.bmHeight, memDC, , , SRCCOPY); //内存DC映射到屏幕DC
ReleaseDC(sBitHwnd, bitDc);
/*如果需要把位图转换*/
/*
CImage image;
image.Create(nWidth, nHeight, nBitPerPixel);
BitBlt(image.GetDC(), 0, 0, nWidth, nHeight, hdcSrc, 0, 0, SRCCOPY);
::ReleaseDC(NULL, hdcSrc);
image.ReleaseDC();
image.Save(path, Gdiplus::ImageFormatPNG);//ImageFormatJPEG
*/
#endif
DeleteObject(memBitmap);
DeleteObject(oleImage);
DeleteDC(memDC);
ReleaseDC(hwnd,pDC); }
c++ 屏幕截图指定窗口句柄后台截图返回位图句柄的更多相关文章
- 基于java的后台截图功能的实现
Java后台截图功能的实现 背景介绍: 在近期开发的可视化二期项目中的邮件项目中,邮件中的正文中含有图片.该图片的产生是将一些html网页转为图片格式,刚开始考虑使用第三方组件库html2image和 ...
- C# 非顶端窗口截图 - 用于查找指定窗口并截图
原文地址:http://blog.csdn.net/u013096568/article/details/53400389 panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡 ...
- AJAX JQuery 调用后台方法返回值(不刷新页面)
AJAX JQuery 调用后台方法返回值(不刷新页面) (1)无参数返回值(本人亲试返回结果不是预期结果) javascript方法: $(function () { //无 ...
- hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性
// hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...
- struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)
JSON主要创建如下两种数据对象: 由JSON格式字符串创建,转换成JavaScript的Object对象: 由JSON格式字符串创建,转换成JavaScript的List或数组链表对象. 更多关于J ...
- 指定字符串 s,返回 s 所有可能的子串,每个子串必须是一个回文(指顺读和倒读都一样的字符串)
Given a string s, partition s such that every substring of the partition is a palindrome Return all ...
- 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据
1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...
- 从指定的view中截图 返回UIImage
-(UIImage *)getImageFromView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); [view.la ...
- AJAX回调(调用后台方法返回数据)
记得先要导入jquery.js. 格式一 $.ajax({"Key1":"value1","key2":"value2" ...
随机推荐
- Mysql查询某个月的每一天的数据
需求:查询最近三个月的每一天的业绩总和 因为最近三个月每个月的天数是不一样,所以不能用这篇文章:Mysql查询最近30天的数据(每天的业绩总和数据) 介绍的用固定多少天去查数据.需要一个新方法. 一. ...
- oracle函数greatest(exp1,exp2,exp3,……,expn)
[功能]返回表达式列表中值最大的一个.如果表达式类型不同,会隐含转换为第一个表达式类型. [参数]exp1……n,各类型表达式 [返回]exp1类型 [示例] SELECT greatest(10,3 ...
- es6 promise简析
1.Promise的含义 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点: 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...
- css3制作动画性能问题
这篇文章主要讲的是怎样制作流畅动画,特别是针对移动端.在这里我首先介绍制作动画的几种方法的优缺点:接着会着重介绍用css3制作动画的注意事项. 1.用canvas.css3.jquery制作动画 Ca ...
- vue element 中自定义传值
一直以来都不知道如何传自定义的值,一直只会默认的,今天终于找到方法了. 比如这个上传图片的控件,想带当前的index过去,就这样写.其它的类似 :http-request="(file,fi ...
- Object-c学习笔记十八-----NSPredicate
Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...
- C运行时库函数和API函数的区别和联系
C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数 API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函 ...
- php服务端允许跨域访问
>>php服务端允许跨域访问<< >>同源策略和跨域解决方案<<
- centos6 名字服务dnsmasq配置
1 主机名配置 主机hd1配置(后面配置为名字服务器) [grid_hd@hd1 Desktop]$ cat /etc/sysconfig/network NETWORKING=yes HOSTNAM ...
- vue+vant 购物车的全选和反选
https://blog.csdn.net/wjswangjinsheng/article/details/91392694