windows截屏
#ifndef _CAPTURESCREEN_H
#define _CAPTURESCREEN_H #include <windows.h>
class CaptureScreen
{
public:
CaptureScreen()
{};
~CaptureScreen(void)
{}; void ScreenInit();
void ScreenFree();
bool ScreenSetWindow(LPRECT lpRect);
bool ScreenCopy(BYTE *dstBuf); int rHeight; //要获得的图像尺寸
int rWidth;
private:
int nScreenWidth;
int nScreenHeight;
PRGBTRIPLE scan0;
BITMAPINFO pbi;
int stride;
int top_x;
int top_y;
int bot_x;
int bot_y;
}; #endif
#include "CaptureScreen.h" void CaptureScreen::ScreenInit()
{
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN); pbi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi.bmiHeader.biWidth = nScreenWidth;
pbi.bmiHeader.biHeight = nScreenHeight;
pbi.bmiHeader.biPlanes = ;
pbi.bmiHeader.biBitCount = ;
pbi.bmiHeader.biCompression = BI_RGB;
stride = ((nScreenWidth * + ) & 0xffffffe0) / ; // 24位图像扫描线宽度
scan0 = (PRGBTRIPLE)malloc(stride * nScreenHeight); // 图像数据缓冲区,应释放
} void CaptureScreen::ScreenFree()
{
free(scan0);
} bool CaptureScreen::ScreenSetWindow(LPRECT lpRect)
{
top_x = lpRect->left;
top_y = lpRect->top;
bot_x = lpRect->right;
bot_y = lpRect->bottom;
if(top_x >= bot_x)
return false;
if(top_y >= bot_y)
return false;
if(top_x< || bot_x>nScreenWidth)
return false;
if(top_y< || bot_y>nScreenHeight)
return false; rHeight = bot_y-top_y;
rWidth = bot_x-top_x;
return true;
} bool CaptureScreen::ScreenCopy(BYTE *dstBuf)
{
HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC,nScreenWidth, nScreenHeight);
SelectObject(hCaptureDC,hCaptureBitmap);
BitBlt(hCaptureDC,,,nScreenWidth,nScreenHeight,hDesktopDC,,,SRCCOPY|NOMIRRORBITMAP);
DeleteDC(hCaptureDC); GetDIBits(hDesktopDC, hCaptureBitmap, , nScreenHeight, scan0, &pbi, DIB_RGB_COLORS);
ReleaseDC(hDesktopWnd,hDesktopDC);
DeleteObject(hCaptureBitmap); BYTE *srcBuf = (BYTE*) scan0; int j;
srcBuf += (nScreenHeight--top_y)*stride+top_x*;// scan0倒序
for(j=;j<rHeight;j++)
{
memcpy(dstBuf,srcBuf,rWidth*);
dstBuf += rWidth*;
srcBuf -= stride;
}
return true;
}
#include "CaptureScreen.h"
#include <stdio.h>
#include <Mmsystem.h>
#pragma comment( lib,"winmm.lib" )
void SaveBmp2(BYTE *bgr32,int w,int h,int mode)
{ /////////////////////////////////////////////
DWORD size=w*h*;
LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biWidth=w;
bih.biHeight=h;
bih.biPlanes=;
bih.biBitCount=;
bih.biCompression=;
bih.biSizeImage=w*h*;//size;
bih.biXPelsPerMeter=;
bih.biYPelsPerMeter=;
bih.biClrUsed=;
bih.biClrImportant=; BITMAPFILEHEADER bfh;
bfh.bfType=0x4D42; // "BM" // 设置位图文件头
bfh.bfReserved1=bfh.bfReserved2=;
bfh.bfSize=+size;
bfh.bfOffBits=; if(mode == )
{
for(int i=;i<h;i++)
{
memcpy(lpData+(h--i)*w*,bgr32+i*w*,w*);
}
}
else
memcpy(lpData,bgr32,w*h*); static int filecount=;
char filename[];
sprintf(filename,"C:\\%d.bmp",filecount);
FILE *fp=fopen(filename,"wb"); if(fp)
{ fwrite(&bfh,,sizeof(BITMAPFILEHEADER),fp);
fwrite(&bih,,sizeof(BITMAPINFOHEADER),fp);
fwrite(lpData,,size,fp);
fclose(fp);
filecount++;
}
GlobalFree(lpData); } int main()
{ CaptureScreen myCapture;
myCapture.ScreenInit();
RECT dstRect={,,,};
myCapture.ScreenSetWindow(&dstRect);
BYTE *dstBuff = (BYTE*)malloc(myCapture.rWidth*myCapture.rHeight*);
int lastTime = timeGetTime();
myCapture.ScreenCopy(dstBuff);
printf("time:%dms",timeGetTime()-lastTime);
SaveBmp2((BYTE*)dstBuff,myCapture.rWidth,myCapture.rHeight,);
myCapture.ScreenFree(); return ;
}
windows截屏的更多相关文章
- C# 编写一个简单易用的 Windows 截屏增强工具
半年前我开源了 DreamScene2 一个小而快并且功能强大的 Windows 动态桌面软件.有很多的人喜欢,这使我有了继续做开源的信心.这是我的第二个开源作品 ScreenshotEx 一个简单易 ...
- 团队软件开发_基于windows下截屏软件关于NABC框架的特点
经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的 ...
- Windows之系统自带截屏快捷键
Windows之系统自带截屏快捷键 现在我们都习惯了使用QQ截屏,但是有时候电脑没有网络,也就意味着无法登陆QQ,在这个时候再有截屏的需求时,我们就束手无策了. 截取全屏 现在我说以个Windows系 ...
- 【Windows 10 应用开发】如何防止应用程序被截屏
今天老周只想跟大伙们分享一个小技巧,是的,小小的技巧,很简单,保证你能学会的,要是学不会,可以考虑跳泰山. 有些时候,我们可能会想到不要让应用程序界面上显示的内容被截屏,要阻止应用界面呈现在截图上,可 ...
- 截屏快捷键(windows)自带截屏,不需要安装任何插件
方案一:电脑自带截屏,不需要QQ Shift+win+s即可截图(推荐使用) 方案二:搜狗输入法下载自带:Ctrl+Shift+x
- MonoGame 3.2 下,截屏与 Texture2D 的保存
10月20日注:后来发现了这篇博文(英文),XNA 中的 Color 实际上是与 Alpha 值自左乘(premultiplied)的,这也解释了直接用 0xARGB 转译而颜色异常的原因. 注意,由 ...
- C#截屏
本实例代码实现了WinForm截屏保存为图片,亲测可行. 界面截图: 下载:http://hovertree.com/h/bjaf/scjyuanma.htm 以下代码可以实际运行,在项目HoverT ...
- 一个仿windows泡泡屏保的实现
一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
- OpenGL 多视图与截屏
最近看红宝书学习 OpenGL 一段时间了,写了简单的 demo 程序温习一下知识. 主要是 使用 glScissor 多视图显示画面和使用 glReadPixels 给画面截屏,使用显示列表(dis ...
随机推荐
- JAVA中生成Excel方法
java 操作 Excel 最常用的就是JXL(java excel api)和POI,今先看下JXL吧.首先可以到 http://www.andykhan.com/jexcelapi/downloa ...
- Linux各发行版本简介
简介 Linux 主要作为Linux发行版(通常被称为"distro")的一部分而使用.这些发行版由个人,松散组织的团队,以及商业机构和志愿者组织编写.它们通常包括了其他的系统软件 ...
- [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)
快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...
- Hibernate体系结构的简单介绍
Hibernate体系结构的简单介绍 1.SessionFactory: 单个数据库映射关系经过编译后的内存镜像,是线程安全的.它是生产Session的工厂,本身需要依赖于ConnectionPeov ...
- Git笔记 整理2
补充: 1,如何只克隆git仓库中的一个分支? git clone -b <branch> <remote_repo> eg: git clone -b vivien_dev ...
- [转]Unity3d之MonoBehaviour的可重写函数整理
最近在学习Unity3d的知识.虽然有很多资料都有记录了,可是我为了以后自己复习的时候方便就记录下来吧!下面的这些函数在Unity3d程序开发中具有很重要的作用. Update 当MonoBehavi ...
- SQL 汉字转换成拼音首字母 首字母查
-- ============================================= -- 功能:汉字转换成拼音首字母 首字母查 -- ========================== ...
- 1:wamp如何更改网站根目录DocumentRoot 2:php的error_log文件(txt)会每秒几十K增大
wamp如何更改网站根目录DocumentRoot 想必很多人都使用wamp来开发php的web应用吧,同时某些情况下我们或许需要修改服务器的根目录来方便我们搭建和开发网站,接下里我们将说明如 ...
- FreeSWITCH 1.6在Debian 8上的安装
鉴于上次在CentOS 7上安装不成功,这次换Debian. 现在已经成功的CentOS 7上安装好了. 感兴趣的同学移步https://freeswitch.org/confluence/displ ...
- Java_JDK_TreeMap
(一)TreeMap TreeMap使用的是红黑树来实现的,所以重点是红黑树的插入和删除. 红黑树的3个特性: 根节点和所有外部节点的颜色都是黑色的: 从根节点到外部节点的途中没有连续两个节点的颜色是 ...