慢羊羊的空间

工作做不完了,300出,无瑕。

实现桌面截图 铜牌收录

本文讲解怎样截取整个桌面的图像。

对于控制台程序,执行后首先会创建一个黑色的控制台窗口,然后才会启动你的程序。因此这时候抓到的图,会包括一个黑色的控制台窗口,我想,这是大多数人不希望看到的。因此,实现抓图,要建立的项目需要是 Win32 Application,而不能是平时用的 Win32 Console Application。怎样创建一个 Win32 Application,请参考文章《在没有控制台的 Win32 Application 中使用 EasyX 绘图》。

名词介绍

DC:英文单词 Device Contexts(设备上下文) 的缩写。DC 中包含有用于该设备的一组绘图对象以及这些对象的属性(例如画笔、画刷等)。

原理简介

要获取桌面内容,先要获取桌面的 DC,然后再通过图像拷贝语句将桌面图像的内容拷贝到 IMAGE 的 DC 中。

实现步骤

因为实现起来简单,步骤已经以注释的形式写到了下面的示例代码中:

/////////////////////////////////////////////////////////
// 程序名称:实现桌面截图
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20220901
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2013-1-29
// 项目类型:Win32 Application
//
#include <graphics.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// 获取桌面 DC
	HDC srcDC = GetDC(NULL);
	// 创建目标 IMAGE 对象
	IMAGE img(640, 480);
	// 获取 IMAGE 对象的 DC
	HDC dstDC = GetImageHDC(&img);
	// 在两个 DC 之间执行图像拷贝,将桌面抓图拷贝到 IMAGE 对象里面
	BitBlt(dstDC, 0, 0, 640, 480, srcDC, 0, 0, SRCCOPY);

	// 创建绘图窗口
	initgraph(640, 480);
	// 在窗口中显示 IMAGE 中保存的桌面图像
	putimage(0, 0, &img);

	// 按任意键退出
	getmessage(EX_CHAR);

	closegraph();
	return 0;
}

示例封装

这一步实现对以上功能的封装,以便更方便的调用抓图功能。封装后的代码如下:

/////////////////////////////////////////////////////////
// 程序名称:实现桌面截图
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20220901
// 作  者:yangw80 <yw80@qq.com>
// 最后修改:2013-1-29
// 项目类型:Win32 Application
//
#include <graphics.h>


// 抓取桌面图像到 *pimg 对象中
void CaptureDesktop(IMAGE *pimg)
{
	// 通过 Windows API 获取桌面的宽高
	int w = GetSystemMetrics(SM_CXSCREEN) / 2;
	int h = GetSystemMetrics(SM_CYSCREEN) / 2;

	// 调整 pimg 的大小
	Resize(pimg, w, h);

	// 获取桌面 DC
	HDC srcDC = GetDC(NULL);
	// 获取 IMAGE 对象的 DC
	HDC dstDC = GetImageHDC(pimg);

	// 在两个 DC 之间执行图像拷贝,将桌面抓图拷贝到 IMAGE 对象里面
	BitBlt(dstDC, 0, 0, w, h, srcDC, 0, 0, SRCCOPY);
}


// 主函数
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// 定义 IMAGE 对象
	IMAGE img;

	// 调用抓取桌面图像的函数
	CaptureDesktop(&img);

	// 创建绘图窗口
	initgraph(640, 480);

	// 在窗口中显示 IMAGE 中保存的桌面图像
	putimage(0, 0, &img);

	// 按任意键退出
	getmessage(EX_CHAR);

	closegraph();
	return 0;
}

评论 (2) -

  • 创建窗口第二个程序可能写的不对,是640吧
    • 第一个的640只是示例,这里的h和w是从系统那里获取的桌面大小,如果用常量的话截的就不全了(况且谁屏幕这么小)

添加评论