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 ...
随机推荐
- uva 816 Abbott的复仇
题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求 ...
- 局域网无法访问vmware虚拟机WEB服务器解决办法
环境:虚拟机服务器是centos,apache+php+mysql环境,但是局域网无法访问 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3.虚拟机能访问自己的web 4.本机无法访问虚拟 ...
- 2016年11月6日 星期日 --出埃及记 Exodus 19:22
2016年11月6日 星期日 --出埃及记 Exodus 19:22 Even the priests, who approach the LORD, must consecrate themselv ...
- qbxt十一系列一
希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...
- 从Unity学UE(一)之蓝图类的使用----制作一个可控灯光
转自:http://blog.csdn.net/u011707076/article/details/44171829 首先申明,本文章内容适合有Unity引擎基础的童鞋享用,如果不了解Unity引擎 ...
- SQL Server小技巧【1】
1.SQL防止修改数据时引起多用户并发,当一条数据被一个用户锁定的时候其他用户将无法修改,除非将其释放. UPDATE TABLENAME WITH(ROWLOCK) SET 字段='Value' W ...
- Codeforces Round #260 (Div. 2)AB
http://codeforces.com/contest/456/problem/A A. Laptops time limit per test 1 second memory limit per ...
- FJNU 1155 Fat Brother’s prediction(胖哥的预言)
FJNU 1155 Fat Brother’s prediction(胖哥的预言) Time Limit: 1000MS Memory Limit: 257792K [Description] [ ...
- FZU 2105 Digits Count(位数计算)
Description 题目描述 Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations: Operation ...
- url 转码 urlencode和 urldecode
参考网址http://www.t086.com/code/php/function.php-urlencode.php urlencode 将字符串以 URL 编码. 语法: string urlen ...