Windows API用以实现屏幕截图的方法

分成两个部分,一个是用getScrnBmp函数使用Windows API获取BMP图像,getJpg函数使用atlimage类实现将bmp压缩成jpg格式,注意不像jpeglib一样,压缩的出的jpg图像是无法选择清晰度的。

struct scrnStrc
{
	BYTE *bff;
	int sz;
};


struct scrnStrc* ScrnCls::getScrnBmp() 
{


//得到设备屏幕
	HDC hDc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
	int wdth, hght;

	wdth = GetSystemMetrics(SM_CXSCREEN);
	hght = GetSystemMetrics(SM_CYSCREEN);   //获得屏幕像素数

	HDC hMDc = CreateCompatibleDC(hDc);  //创建一个与指定设备兼容的内存设备上下文环境

	HBITMAP hBmp = CreateCompatibleBitmap(hDc, wdth, hght); //创建与指定的设备环境相关的设备兼容的位图
	SelectObject(hMDc, hBmp);  //选择一对象到指定的设备上下文环境中 将hBmp送到hMDc上下文环境中
	BITMAP bmp;

	GetObject(hBmp, sizeof(bmp), &bmp);      //获取图像信息

	BitBlt(hMDc, 0, 0, wdth, hght, hDc, 0, 0, SRCCOPY);   //从hDc拷贝到hMDc

	byte* byt;
	DWORD sz;

	ScrnCls::getJpg(hBmp,&byt,&sz);


	struct scrnStrc  *strc=(struct scrnStrc *)malloc(sizeof(struct scrnStrc));

	strc->bff =byt;
	strc->sz =sz;

	cnt++;

	return strc;

}

int ScrnCls::getJpg(HBITMAP hBmp,byte ** bytArr,DWORD * sz)
{
	CImage *img= new CImage;

	img->Attach(hBmp);

	//HGLOBAL hg;

	//hg = GlobalAlloc(GMEM_NODISCARD | GMEM_ZEROINIT | GMEM_MOVEABLE, 0x100000);

	IStream* is=NULL;

	CreateStreamOnHGlobal(NULL, FALSE, &is);  //不需要申请HGlobal空间

	img->Save(is, Gdiplus::ImageFormatJPEG);

	LARGE_INTEGER li;

	li.QuadPart = 0;

	is->Seek(li, STREAM_SEEK_SET, NULL);  //把流的位置移动到开始处

	byte* jpgBytArr;

	STATSTG stt;

	is->Stat(&stt, STATFLAG_DEFAULT);

	DWORD szArr,szWrt=0;

	szArr = (DWORD)stt.cbSize.LowPart;

	jpgBytArr = (byte*)malloc(szArr + 0x1000);


	memset(jpgBytArr, 0, sizeof(jpgBytArr));

	is->Read(jpgBytArr, szArr, &szWrt);

	*sz = szWrt;

	//释放资源
	is->Release();

	*bytArr = jpgBytArr;

	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
快速查询 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoseZang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值