vc屏幕截图实现

1.获取保存截图文件的路径,暂时选定为桌面

//把截图的文件保存到桌面
virtual BOOL CaptureLolToDesktop(HWND hWnd)
{
	Sleep(1*1000);
	LPRECT lprc = new RECT;
	GetWindowRect(hWnd,lprc);
	std_string strTime;
	DWORD llocaltime = GetTickCount();
	char chDesktopPath[MAX_PATH] = {0};
	SHGetSpecialFolderPathA(NULL,chDesktopPath,CSIDL_DESKTOP,0);//获取当前用户桌面路径
	strTime.Format("%s\\截图%ld.jpg",chDesktopPath ,llocaltime);
	logs->WriteFormat("截图保存路径为%s",strTime.c_str());
	ScreenCapture(LPSTR(strTime.c_str()),16,lprc);
	delete lprc;
	return TRUE;
}

2.截图实现

//屏幕截图功能实现
virtual HBITMAP ScreenCapture(LPSTR filename,WORD bitCount,LPRECT lpRect)
{
	HBITMAP hBitmap;
	HDC hScreenDC=CreateDCA("DISPLAY",NULL,NULL,NULL);	 //通过指定DISPLAY来获取一个显示设备上下文环境
	HDC hmemDC=CreateCompatibleDC(hScreenDC);			 //该函数创建一个与指定设备兼容的内存设备上下文环境(DC)
	int ScreenWidth=GetDeviceCaps(hScreenDC,HORZRES);	 //获取指定设备的性能参数(此处获取屏幕宽度)
	int ScreenHeight=GetDeviceCaps(hScreenDC,VERTRES);	 //获取指定设备的性能参数(此处获取屏幕高度)
	HBITMAP hOldBM;
	PVOID lpData;	//内存分配成功返回的指向所分配内存块的首地址指针
	int startX;		//截图x位置
	int startY;		//截图y位置
	int width;		//截图宽度
	int height;		//截图高度
	long BitmapSize;
	DWORD BitsOffset;
	DWORD ImageSize;
	DWORD FileSize;
	BITMAPINFOHEADER bmInfo; //BITMAPINFOHEADER结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案
	BITMAPFILEHEADER bmFileHeader;
	HANDLE bmFile,hpal,holdpal=NULL;;
	DWORD dwWritten;
	if(lpRect==NULL)
	{
		startX=startY=0;
		width=ScreenWidth;
		height=ScreenHeight;
	}
	else
	{
		startX=lpRect->left;
		startY=lpRect->top;
		width=lpRect->right-lpRect->left;
		height=lpRect->bottom-lpRect->top;
	}
	//创建一张长width,宽height的画布,用于后面绘制图形
	hBitmap=CreateCompatibleBitmap(hScreenDC,width,height);
	//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
	hOldBM=(HBITMAP)SelectObject(hmemDC,hBitmap);
	//该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
	BitBlt(hmemDC,0,0,width,height,hScreenDC,startX,startY,SRCCOPY);
	hBitmap=(HBITMAP)SelectObject(hmemDC,hOldBM);
	if(filename==NULL)
	{
		DeleteDC(hScreenDC);
		DeleteDC(hmemDC);
		return hBitmap;
	}
	BitmapSize=((((width*32)+32)/32)*4)*height;
	//用来在指定的堆上分配内存,并且分配后的内存不可移动(HEAP_NO_SERIALIZE 不使用连续存取)
	lpData=HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,BitmapSize);
	ZeroMemory(lpData,BitmapSize);
	ZeroMemory(&bmInfo,sizeof(BITMAPINFOHEADER));
	bmInfo.biSize=sizeof(BITMAPINFOHEADER); //位图信息结构长度 ,必须为40
	bmInfo.biWidth=width;					//图像宽度 单位是像素
	bmInfo.biHeight=height;					//图像高度 单位是像素
	bmInfo.biPlanes=1;						//必须为1
	bmInfo.biBitCount=bitCount;				//设置图像的位数。比如8位,16位,32位位数越高分辨率越高
	bmInfo.biCompression=BI_RGB;			//位图是否压缩 BI_RGB为不压缩
	ZeroMemory(&bmFileHeader,sizeof(BITMAPFILEHEADER));
	BitsOffset=sizeof(BITMAPFILEHEADER)+bmInfo.biSize;
	ImageSize=((((bmInfo.biWidth*bmInfo.biBitCount)+31)/32)*4)*bmInfo.biHeight;
	FileSize=BitsOffset+ImageSize;
	bmFileHeader.bfType=0x4d42;//'B'+('M'<<8);
	bmFileHeader.bfSize=FileSize;
	bmFileHeader.bfOffBits=BitsOffset;
	hpal = GetStockObject(DEFAULT_PALETTE);
	if (hpal)
	{
		holdpal = SelectPalette(hmemDC, (HPALETTE)hpal, false);
		RealizePalette(hmemDC);
	}
	GetDIBits(hmemDC,hBitmap,0,bmInfo.biHeight,lpData,(BITMAPINFO *)&bmInfo,DIB_RGB_COLORS);
	if (holdpal)
	{
		SelectPalette(hmemDC, (HPALETTE)holdpal, true);
		RealizePalette(hmemDC);
	}
	bmFile=CreateFileA(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if(bmFile==INVALID_HANDLE_VALUE)
	{
		MessageBoxA(NULL,"Create File Error!","提示",MB_OK | MB_ICONWARNING);
	}
	WriteFile(bmFile,&bmFileHeader,sizeof(BITMAPFILEHEADER),&dwWritten,NULL);
	WriteFile(bmFile,&bmInfo,sizeof(BITMAPINFOHEADER),&dwWritten,NULL);
	WriteFile(bmFile,lpData,ImageSize,&dwWritten,NULL);
	CloseHandle(bmFile);
	HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,lpData);
	::ReleaseDC(0,hScreenDC);
	DeleteDC(hmemDC);
	logs->WriteFormat("【截图保存成功】");
	//MessageBoxA(NULL,"玩家您好,你的本场游戏战绩已经通过截图保存在桌面","提示",MB_OK);
	return hBitmap;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 22:51:35

vc屏幕截图实现的相关文章

什么值得买:一家论坛式导购网站的自我修养

什么值得买 的用户把这个网站亲切称为"色魔张大妈"(SMZDM演化而来),虽然这个昵称有些恶搞的成分,但这是一家我印象中这个时代为数不多的"正常"公司.它没有颠覆什么,但重新定义了什么是"值",并且改变了一大批人的消费习惯. 在电商领域,什么值得买从创立初始就在节奏与气质上特立独行,包括其至今都没有涉及"交易"环节.电商行业里,如果一家公司不擅长赶政策热点.赶创业故事热潮,很难在资本市场为自己谈到一个好价钱,没钱烧就没有资源支

图解在VC里使用graphics.h绘图(类似TC)

1 www.easyx.cn 下载 EasyX 库 我下的2014;解压后如下图: 2 根据自己的VC 版本进行安装 3 在控制台画一个圆 #include <graphics.h> // 引用图形库 #include <conio.h> void main() { initgraph(640, 480); // 初始化绘图窗口 circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100 getch(); // 按任意键继续 closegrap

Windows下VC编译OpenDDS

OpenDDS是一个OMG组织DDS标准的C++开源实现,OpenDDS同时也提供Java支持.OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器).当前OpenDDS有ociweb ObjectComputing维护,官方网站http://www.opendds.org/.目前OpenDDS支持的平台有Windows,Linux family,Android,VxWorks等,可用的编译器包括VC,gcc,QNX gcc等. 1. OpenDDS

一种利用ADO连接池操作MySQL的解决方案(VC++)

VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连接永远不关闭,直接数进程退出),但是这样做至少会引起两个问题:(1)资源竞争,多个数据库请求操作不能同时进行,后一请求必须要等到前一请求完成后才能进行:(2)多线程情况下容易出现混乱,甚至出现资源异常释放.还有一种方法,就是使用数据库时创建连接,使用完后关闭连接回收资源.这种方式在数据库操作频繁的情

VC客户端无法登陆都是REDO日志惹的祸

环境:VSPHERE5.5+独立oracle 11G数据库 现象:打开vcenter服务器控制台,输入密码后卡在欢迎界面无响应,客户端也无法正常登陆. 正常重启也不行.由于VC所在虚机为独立磁盘无法做快照,不能备当时状态. 查看所在WINDOWS系统日志发现硬件可能有问题. 这是偏移量,并不能代表硬件有问题,怀疑VC连接的数据库有问题,逐登陆排查.1.登陆11.15.146.2 首先查看数据库进程,正常. 2.查看数据库的告警日志,发现一个问题. 这个实际上是个比较常见的错误.通常来说是因为在日

【转载】COM 组件设计与应用(十四)——事件和通知(vc.net)

原文:http://vckbase.com/index.php/wv/1244.html 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者: 我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者: ... ... ... ... 本回书开始话说 COM 的事件.通知.连接点......这些内容比较多,我分两次(共四回)来介绍. 二.通知的方法 当程序

VC++6.0中OpenGL应用程序开发

1. Win32控制台方式 建立Win32 控制台程序,在头文件中加入 #include <windows.h>  #include <wingdi.h>  #include <GL/gl.h>  #include <GL/glu.h >   #include <GL/glaux.h> 2. MFC方式 (1)采用VC AppWizard向导创建空的MFC(EXE)工程框架,整个过程总共6步,值得指出的是一般情况下在向导的第1步选择创建工程的模式

vc++6.0快捷键

Ctrl+m+Crtr+o折叠所有大纲 Ctrl+M+Crtr+P: 停止大纲显示 Ctrl+K+Crtr+C: 注释选定内容 Ctrl+K+Crtr+U: 取消选定注释内容 Ctrl+J : 列出成员 智能感知Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 

vc 制作图片资源dll

方法一: 使用纯WIN32 DLL方法封装纯资源第一步,通过VS2005建立WIN32 DLL 空工程第二步,设置配置属性->链接器->高级->无入口点(是/NOENTRY)设置配置属性->C/C++->代码生成->运行时库(多线程/MT)第三步,加入图片资源并定义资源名称第四步,生成DLL,如Skin.DLL第五步,调用方法例子HINSTANCE hLibrary; if ((hLibrary = LoadLibrary (TEXT ("skin.DLL&q