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 ...
随机推荐
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
- css3 转换transfrom 过渡transition 和两个@
做了一个demo.用到一些css3的动画,还是不太熟练,总结了一下. 1. -webkit-font-smoothing: antialiased; -webkit-font-smoot ...
- php访问mysql数据库
//建一个连接,造一个连接对象 $db = new MySQLi("localhost","root","123","mydb&q ...
- Centos6.6上安装mysql5.6中的一些典型问题
经过两天的摸索,终于成功在CentOS6.6系统上成功安装了mysql5.6,现整理如下. (1)安装时的问题: 最小化安装后,安装rpm包时经常会遇到 linux/centos Header V3 ...
- BZOJ 3546 Life of the Party (二分图匹配-最大流)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3546 题意:给定一个二分图.(AB两个集合的点为n,m),边有K个.问去掉哪些点后 ...
- linux Chrome 安装
1.wget 32bits: wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb 64bits: ...
- sql 执行计划
SQL Server执行计划的理解 要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL S ...
- 9.Methods(二)
4.Operator Overload Methods allow a type to define how operators should manipulate instances of the ...
- 在SQL Server中 获取日期、日期格式转换
--常用日期转换参数: PRINT CONVERT(varchar, getdate(), 120 ) 2016-07-20 16:09:01 PRINT replace(replace(replac ...
- php提高程序效率的24个小技巧
本文转自<php必须知道的300个问题>一书,在此记录方便以后查看 (1)用单引号代替双引号来包含字符串,这样做会更快些.因为php会在双引号包围的字符串中搜寻变量,单引号则不会.注意:只 ...