VC++ 屏幕捕获(DirectDraw)
1、初始化DirectDraw接口
#include <ddraw.h>
LPDIRECTDRAW m_lpDDraw;
LPDIRECTDRAWSURFACE m_lpDDSPrime;
LPDIRECTDRAWSURFACE m_lpDDSBack;
DDSURFACEDESC m_DDSdesc;
#pragma comment(lib, "ddraw.lib")BOOL InitDDraw()
{HRESULT hr = DirectDrawCreate(NULL, &m_lpDDraw, NULL);if (FAILED(hr))return FALSE;hr = m_lpDDraw->SetCooperativeLevel(NULL, DDSCL_NORMAL);if (FAILED(hr))return FALSE;DDSURFACEDESC DDSdesc;ZeroMemory(&DDSdesc, sizeof(DDSdesc));DDSdesc.dwSize = sizeof(DDSdesc);DDSdesc.dwFlags = DDSD_CAPS;DDSdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;hr = m_lpDDraw->CreateSurface(&DDSdesc, &m_lpDDSPrime, NULL);if (FAILED(hr))return FALSE;ZeroMemory(&DDSdesc, sizeof(DDSdesc));DDSdesc.dwSize = sizeof(DDSdesc);DDSdesc.dwFlags = DDSD_ALL;hr = m_lpDDSPrime->GetSurfaceDesc(&DDSdesc);if (FAILED(hr))return FALSE;// 备份描述信息memcpy(&m_DDSdesc, &DDSdesc, sizeof(DDSdesc));DDSdesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;DDSdesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;hr = m_lpDDraw->CreateSurface(&DDSdesc, &m_lpDDSBack, 0);if (FAILED(hr))return FALSE;return TRUE;
}
2、捕获屏幕数据
BOOL CaptureScreenImage(RECT &rcCapture, void *pData, INT &nLen)
{if (m_lpDDSBack == NULL)return FALSE;HRESULT hr = m_lpDDSBack->BltFast(rcCapture.left, rcCapture.top, m_lpDDSPrime, &rcCapture, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);if (FAILED(hr))return FALSE;DDSURFACEDESC surfDesc;ZeroMemory(&surfDesc, sizeof(surfDesc));surfDesc.dwSize = sizeof(surfDesc);hr = m_lpDDSBack->Lock(&rcCapture, &surfDesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);if (FAILED(hr))return FALSE;// 这里拷贝的是位深度为32位数据memcpy(pData, (BYTE*)surfDesc.lpSurface, surfDesc.dwWidth * surfDesc.dwHeight * surfDesc.ddpfPixelFormat.dwRGBBitCount / 8);m_lpDDSBack->Unlock(surfDesc.lpSurface);return TRUE;
}
鉴于DirectDraw接口使用次数比较少,所以功能并没有并入到之前的屏幕捕获(GDI/DXGDI)统一接口中去。
VC++ 屏幕捕获(DirectDraw)相关推荐
- VC++屏幕捕获并保存成图片(附源码)
目录 1.屏幕捕获(截取桌面) 2.将内存中的位图保存成图片文件 3.完整功能的屏幕截图
- java robot 控制 不用用户 界面_编写一个基于Java Robot类的屏幕捕获工具
Fun and Games(娱乐和游戏)提供了通过Java的Robot类捕获主屏幕设备的功能,并且可以将整个屏幕或者选定的一部分保存为jpeg文件.这篇文章以Swing应用的形式实现了屏幕捕获工具. ...
- MindMapper屏幕捕获功能该如何使用
MindMapper屏幕捕获功能可以让您创建主题时事半功倍,截取的图片可以作为分支添加到导图中,大大的节省添加图片的操作.下面,小编就这个功能,和大家共享运用时的一些小秘诀. 在MindMapper中 ...
- 【181030】超酷的VC++屏幕作图(电子画笔)程序源代码
VC++屏幕作图程序,和电子画笔很相似,画图时自动隐藏主程序,可以设置程序是否是在最前端显示.设置画线颜色.画笔风格.启动时自动开始.精细,还可以设置热键等,三峡大学程红秀的作品,感谢奉献 源码下载地 ...
- ScreenCapture:通过DirectX 库进行屏幕捕获
具有音频混合功能的 DirectX 硬件屏幕捕获和编码. H264/H265/VP80/VP90/FLAC/MP3. 以硬件方式捕获视频和屏幕截图. 介绍 有很多关于它的东西. 这是一个简单的单头文件 ...
- Spring 实现屏幕捕获-屏幕共享
Spring 实现屏幕捕获-屏幕共享 使用服务端推送技术SSE+屏幕截屏,实现一个简单的屏幕共享功能 SseEmitter 实现服务端推送功能 java.awt.Toolkit 获取屏幕截屏 屏幕截屏 ...
- Bytescout屏幕捕获,SDK ActiveX的主要功能
Bytescout屏幕捕获,SDK ActiveX的主要功能 如果您构建的应用程序旨在将屏幕动作记录到WMV,AVI电影文件中,请利用Bytescout屏幕捕捉SDK向您的程序快速添加显示视频记录功能 ...
- VC++屏幕抓词的技术实现
屏幕上的文字大都是由gdi32.dll的以下几个函数显示的:TextOutA.TextOutW.ExtTextOutA.ExtTextOutW.实现屏幕抓词的关键就是截获对这些函数的调用,得到程序发给 ...
- VC中借助DirectDraw实现水波的模拟
转自:http://tech.163.com/05/0624/10/1N0LUJM600091589.html 摘要:本文介绍了一种对水面波纹的扩散.衰减以及交叠的过程进行计算机模拟的一种实现算法,并 ...
最新文章
- java5引入包装类型的意义_Java中的基本类型和包装类
- ignite服务中的bean注入为空
- C++中的Lock简单用法
- C语言知识体系思维导图
- 编写你的第一个 Django 应用,第 7 部分
- DirectX学习笔记_关于Sprite.Draw2D的说明
- 如何通过示例使用Java中的Exchanger
- Altium AD20的四层板叠层管理、平面层20H内缩
- 菜鸟的学习之路(10) — LinkedList类
- 2.React学习笔记----修改模板并使用Ant Design
- hibernate 多表查询
- linux 安装 vm
- linux网络应用环境,Linux网络环境使用新闻组客户端
- hdu3966-线段树
- 弗洛伊德:本我、自我和超我
- TypeScript入门与区块链项目实战(TypeScript Quickly)阅读记录
- .find()的用法
- 计算机语言市场份额,21年7月编程语言排名:python上升迅速,others占比最高
- 2022-2028年中国工业机器人行业产销需求预测与转型升级分析报告
- Postman模拟接口API:接收请求报文equest,响应返回固定报文response