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)相关推荐

  1. VC++屏幕捕获并保存成图片(附源码)

    目录 1.屏幕捕获(截取桌面) 2.将内存中的位图保存成图片文件 3.完整功能的屏幕截图

  2. java robot 控制 不用用户 界面_编写一个基于Java Robot类的屏幕捕获工具

    Fun and Games(娱乐和游戏)提供了通过Java的Robot类捕获主屏幕设备的功能,并且可以将整个屏幕或者选定的一部分保存为jpeg文件.这篇文章以Swing应用的形式实现了屏幕捕获工具. ...

  3. MindMapper屏幕捕获功能该如何使用

    MindMapper屏幕捕获功能可以让您创建主题时事半功倍,截取的图片可以作为分支添加到导图中,大大的节省添加图片的操作.下面,小编就这个功能,和大家共享运用时的一些小秘诀. 在MindMapper中 ...

  4. 【181030】超酷的VC++屏幕作图(电子画笔)程序源代码

    VC++屏幕作图程序,和电子画笔很相似,画图时自动隐藏主程序,可以设置程序是否是在最前端显示.设置画线颜色.画笔风格.启动时自动开始.精细,还可以设置热键等,三峡大学程红秀的作品,感谢奉献 源码下载地 ...

  5. ScreenCapture:通过DirectX 库进行屏幕捕获

    具有音频混合功能的 DirectX 硬件屏幕捕获和编码. H264/H265/VP80/VP90/FLAC/MP3. 以硬件方式捕获视频和屏幕截图. 介绍 有很多关于它的东西. 这是一个简单的单头文件 ...

  6. Spring 实现屏幕捕获-屏幕共享

    Spring 实现屏幕捕获-屏幕共享 使用服务端推送技术SSE+屏幕截屏,实现一个简单的屏幕共享功能 SseEmitter 实现服务端推送功能 java.awt.Toolkit 获取屏幕截屏 屏幕截屏 ...

  7. Bytescout屏幕捕获,SDK ActiveX的主要功能

    Bytescout屏幕捕获,SDK ActiveX的主要功能 如果您构建的应用程序旨在将屏幕动作记录到WMV,AVI电影文件中,请利用Bytescout屏幕捕捉SDK向您的程序快速添加显示视频记录功能 ...

  8. VC++屏幕抓词的技术实现

    屏幕上的文字大都是由gdi32.dll的以下几个函数显示的:TextOutA.TextOutW.ExtTextOutA.ExtTextOutW.实现屏幕抓词的关键就是截获对这些函数的调用,得到程序发给 ...

  9. VC中借助DirectDraw实现水波的模拟

    转自:http://tech.163.com/05/0624/10/1N0LUJM600091589.html 摘要:本文介绍了一种对水面波纹的扩散.衰减以及交叠的过程进行计算机模拟的一种实现算法,并 ...

最新文章

  1. java5引入包装类型的意义_Java中的基本类型和包装类
  2. ignite服务中的bean注入为空
  3. C++中的Lock简单用法
  4. C语言知识体系思维导图
  5. 编写你的第一个 Django 应用,第 7 部分
  6. DirectX学习笔记_关于Sprite.Draw2D的说明
  7. 如何通过示例使用Java中的Exchanger
  8. Altium AD20的四层板叠层管理、平面层20H内缩
  9. 菜鸟的学习之路(10) — LinkedList类
  10. 2.React学习笔记----修改模板并使用Ant Design
  11. hibernate 多表查询
  12. linux 安装 vm
  13. linux网络应用环境,Linux网络环境使用新闻组客户端
  14. hdu3966-线段树
  15. 弗洛伊德:本我、自我和超我
  16. TypeScript入门与区块链项目实战(TypeScript Quickly)阅读记录
  17. .find()的用法
  18. 计算机语言市场份额,21年7月编程语言排名:python上升迅速,others占比最高
  19. 2022-2028年中国工业机器人行业产销需求预测与转型升级分析报告
  20. Postman模拟接口API:接收请求报文equest,响应返回固定报文response

热门文章

  1. word里面如何在插入的图像上打字
  2. Windows中mysql使用命令行登录
  3. 深富策略:创业板如期大涨 市场正在酝酿大换挡
  4. 天下数据详解免费空间的背后
  5. The Shawshank Redemption-18
  6. 熬夜整理的vue面试题
  7. amp; AMP; 会显示位 | Amp;aMp;amP;会原样显示
  8. 985 高校副教授一年能够拿到多少工资?
  9. 对残差网络resnet shortcut的解释
  10. 鸿蒙开发起步系列 | 环境搭建、HarmonyOS应用开发及智能硬件开发