1. //GDI与DX截屏API操作
  2. LPDIRECTDRAW lpDD = NULL;
  3. LPDIRECTDRAWSURFACE lpDDSPrime = NULL;
  4. LPDIRECTDRAWSURFACE lpDDSBack = NULL;
  5. LPDIRECTDRAWSURFACE lpDDSGdi = NULL;
  6. LPDIRECTDRAWSURFACE lpSurf = NULL;
  7.  
  8. DDSURFACEDESC DDSdesc;
  9. BOOL m_b24=TRUE;
  10. //rfbServerInitMsg m_scrinfo;
  11. RECT m_bmrect;
  12.  
  13. struct _BMInfo {
  14. BITMAPINFO bmi ;
  15. BOOL truecolour;
  16. RGBQUAD cmap[] ;
  17. } m_bminfo; // 用来保存位图信息的结构
  18.  
  19. int DX_Init() {// DirectX初始化。返回当前表面获取一张屏幕位图的存储空间大小
  20. HRESULT hr;
  21.  
  22. // 初始化directX
  23. hr = DirectDrawCreate(, &lpDD, );
  24. if (FAILED(hr)) return FALSE;
  25.  
  26. hr = lpDD->SetCooperativeLevel(NULL, DDSCL_NORMAL);
  27. if (FAILED(hr)) return FALSE;
  28.  
  29. ZeroMemory(&DDSdesc, sizeof(DDSdesc));
  30. DDSdesc.dwSize = sizeof(DDSdesc);
  31. DDSdesc.dwFlags = DDSD_CAPS;
  32. DDSdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  33. hr = lpDD->CreateSurface(&DDSdesc, &lpDDSPrime, );
  34. if (FAILED(hr)) return FALSE;
  35.  
  36. hr = lpDD->GetGDISurface(&lpDDSGdi);
  37. if (FAILED(hr)) return FALSE;
  38.  
  39. ZeroMemory(&DDSdesc, sizeof(DDSdesc));
  40. DDSdesc.dwSize = sizeof(DDSdesc);
  41. DDSdesc.dwFlags = DDSD_ALL;
  42. hr = lpDDSPrime->GetSurfaceDesc(&DDSdesc);
  43. if (FAILED(hr)) return FALSE;
  44.  
  45. // 初始化位图信息
  46. if ((DDSdesc.dwFlags & DDSD_WIDTH) && (DDSdesc.dwFlags & DDSD_HEIGHT)) {
  47. m_bmrect.left = m_bmrect.top = ;
  48. m_bmrect.right = DDSdesc.dwWidth;
  49. m_bmrect.bottom = DDSdesc.dwHeight;
  50. } else return FALSE;
  51.  
  52. m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;//BI_BITFIELDS;
  53. m_bminfo.bmi.bmiHeader.biBitCount = DDSdesc.ddpfPixelFormat.dwRGBBitCount;
  54.  
  55. // m_bminfo.truecolour = DDSdesc.ddpfPixelFormat.dwFlags & DDPF_RGB;
  56. if (m_bminfo.bmi.bmiHeader.biBitCount > )
  57. m_bminfo.truecolour = TRUE;
  58. else
  59. m_bminfo.truecolour = FALSE;
  60.  
  61. ZeroMemory(&DDSdesc, sizeof(DDSdesc));
  62. DDSdesc.dwSize = sizeof(DDSdesc);
  63. DDSdesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
  64. DDSdesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  65. DDSdesc.dwHeight = m_bmrect.bottom - m_bmrect.top;
  66. DDSdesc.dwWidth = m_bmrect.right - m_bmrect.left;
  67. hr = lpDD->CreateSurface(&DDSdesc, &lpDDSBack, );
  68. if (FAILED(hr)) return FALSE;
  69. // hr = lpDDSPrime->QueryInterface( IID_IDirectDrawSurface3, (LPVOID *)&lpSurf);
  70. // if (FAILED(hr)) return FALSE;
  71.  
  72. switch (m_bminfo.bmi.bmiHeader.biBitCount) {
  73. case :
  74. case :
  75. // Update the bitmapinfo header
  76. m_b24 = TRUE;
  77. m_bminfo.bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
  78. m_bminfo.bmi.bmiHeader.biWidth = ;
  79. m_bminfo.bmi.bmiHeader.biHeight = ;
  80. m_bminfo.bmi.bmiHeader.biPlanes = ;
  81. // m_bminfo.bmi.bmiHeader.biBitCount = 24;
  82. m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;
  83. m_bminfo.bmi.bmiHeader.biSizeImage = abs((m_bminfo.bmi.bmiHeader.biWidth * m_bminfo.bmi.bmiHeader.biHeight * m_bminfo.bmi.bmiHeader.biBitCount)/);
  84. m_bminfo.bmi.bmiHeader.biXPelsPerMeter = (*)/;
  85. m_bminfo.bmi.bmiHeader.biYPelsPerMeter = (*)/;
  86. m_bminfo.bmi.bmiHeader.biClrUsed = ;
  87. m_bminfo.bmi.bmiHeader.biClrImportant = ;
  88. break;
  89. }
  90.  
  91. return m_bminfo.bmi.bmiHeader.biSizeImage;
  92. }
  93.  
  94. BOOL CaptureScreen(RECT &rect, BYTE *scrBuff, UINT scrBuffSize) {// 捕捉屏幕。rect: 区域。scrBuff: 输出缓冲。scrBuffSize: 缓冲区大小
  95. HRESULT hr=;
  96.  
  97. hr = lpDDSBack->BltFast(rect.left,rect.top,lpDDSPrime,&rect,DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
  98. if (FAILED(hr)) return FALSE;
  99.  
  100. DDSURFACEDESC surfdesc;
  101. ZeroMemory(&surfdesc, sizeof(surfdesc));
  102. surfdesc.dwSize = sizeof(surfdesc);
  103.  
  104. hr = lpDDSBack->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
  105. // hr = lpDDSPrime->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
  106. if (FAILED(hr)) return FALSE;
  107.  
  108. // copy the data into our buffer
  109. BYTE * destbuffpos, * srcbuffpos;
  110. // m_scrinfo.format.bitsPerPixel = 24;
  111. srcbuffpos = (BYTE *) surfdesc.lpSurface;
  112. destbuffpos = scrBuff;
  113.  
  114. memcpy( destbuffpos, srcbuffpos,m_bminfo.bmi.bmiHeader.biSizeImage);
  115.  
  116. // unlock the primary surface
  117. // lpDDSPrime->Unlock(surfdesc.lpSurface);
  118. lpDDSBack->Unlock(surfdesc.lpSurface);
  119. return TRUE;
  120. }
  121.  
  122. int SaveBitmapToFile(BITMAP *bitmap, LPSTR lpFileName,char *lpBuf) {
  123. DWORD dwWritten;
  124. BITMAPFILEHEADER bmfHdr;
  125. BITMAPINFOHEADER bi;
  126. HANDLE fh=NULL;
  127. bi.biSize = sizeof(BITMAPINFOHEADER);
  128. bi.biWidth= bitmap->bmWidth;
  129. bi.biHeight = bitmap->bmHeight;
  130. bi.biPlanes = ;
  131. bi.biBitCount = bitmap->bmBitsPixel*;
  132. bi.biCompression = BI_RGB;
  133. bi.biSizeImage = ;
  134. bi.biXPelsPerMeter = ;
  135. bi.biYPelsPerMeter = ;
  136. bi.biClrUsed = ;
  137. bi.biClrImportant = ;
  138. fh = CreateFile(lpFileName, GENERIC_WRITE, , NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  139. if (fh == INVALID_HANDLE_VALUE) return FALSE;
  140. bmfHdr.bfType = 0x4D42; // "BM"
  141. bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel;
  142. bmfHdr.bfReserved1 = ;
  143. bmfHdr.bfReserved2 = ;
  144. bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
  145. WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
  146. WriteFile(fh, (char *)&bi,sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
  147. WriteFile(fh, (char *)lpBuf,bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel, &dwWritten, NULL);
  148. FlushFileBuffers(fh);
  149. CloseHandle(fh);
  150. return true;
  151. }
  152.  
  153. //(1)获取屏幕绘图设备
  154. //(2)创建一个与屏幕绘图设备相兼容的内存绘图设备
  155. //(2)在内存中创建一个与屏幕绘图设备相兼容的图像对象
  156. //(3)将屏幕设备中的图像复制到内存绘图设备中
  157. //(4)将内存图像保存到文件中
  158. //相关函数:
  159. //GetDIBits:按位的方式返回指定的BITMAP,并按指定的格式存储到内存中
  160. int GetBitmapFromScreen(char *lpFileName) {
  161. char *lpBuf;
  162. HBITMAP hBitmap,hOld ;
  163. HDC hDC,hcDC;
  164. BITMAP bb;
  165. BITMAPINFO b;
  166. HANDLE hp,fh=NULL;
  167. DWORD dwX,dwY;
  168.  
  169. dwX=GetSystemMetrics(SM_CXSCREEN);
  170. dwY=GetSystemMetrics(SM_CYSCREEN);
  171. hDC=GetDC(NULL);
  172. hcDC=CreateCompatibleDC(hDC);
  173. hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY);
  174. hOld=(HBITMAP)SelectObject(hcDC,hBitmap);
  175. BitBlt(hcDC,, ,dwX,dwY, hDC, , , SRCCOPY);
  176. bb.bmWidth=dwX;
  177. bb.bmHeight =dwY;
  178. bb.bmPlanes = ;
  179. bb.bmWidthBytes=bb.bmWidth*;
  180. bb.bmBitsPixel=;
  181. bb.bmType=;
  182. b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  183. b.bmiHeader.biWidth =dwX;
  184. b.bmiHeader.biHeight =dwY;
  185. b.bmiHeader.biPlanes =;
  186. b.bmiHeader.biBitCount =*;
  187. b.bmiHeader.biCompression =BI_RGB;
  188. b.bmiHeader.biSizeImage =;
  189. b.bmiHeader.biXPelsPerMeter=;
  190. b.bmiHeader.biYPelsPerMeter=;
  191. b.bmiHeader.biClrUsed =;
  192. b.bmiHeader.biClrImportant =;
  193. b.bmiColors[].rgbBlue =;
  194. b.bmiColors[].rgbGreen =;
  195. b.bmiColors[].rgbRed =;
  196. b.bmiColors[].rgbReserved =;
  197. hp=GetProcessHeap();
  198. lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*);
  199. GetDIBits(hcDC,hBitmap,,dwY,lpBuf,&b,DIB_RGB_COLORS);
  200. SaveBitmapToFile(&bb,lpFileName,lpBuf);
  201. ReleaseDC(NULL,hDC);
  202. DeleteDC(hcDC);
  203. DeleteObject(hBitmap);
  204. DeleteObject(hOld);
  205. HeapFree(hp,,lpBuf);
  206. return true;
  207. }

Drectx 3D窗口后台截图的更多相关文章

  1. c++ 屏幕截图指定窗口句柄后台截图返回位图句柄

    /根据窗口句柄后台截图保存成BMP位图文件并且显示到picture 控件上 void GetScreenBmp(HWND hwnd, int left, int top, int width, int ...

  2. 基于java的后台截图功能的实现

    Java后台截图功能的实现 背景介绍: 在近期开发的可视化二期项目中的邮件项目中,邮件中的正文中含有图片.该图片的产生是将一些html网页转为图片格式,刚开始考虑使用第三方组件库html2image和 ...

  3. C# 非顶端窗口截图 - 用于查找指定窗口并截图

    原文地址:http://blog.csdn.net/u013096568/article/details/53400389 panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡 ...

  4. 按键精灵 句柄 获得句柄 控制windows窗口 后台

    新建一个文本文档,打开,Windows就会给这个文本文档的窗口临时分配唯一的一串数字来标识这个窗体,以区别于其他窗口,这串数字就叫句柄.   因为句柄是临时随机分配的,所以每次虽然是打开同一个文件,但 ...

  5. EasyUI + EF + MVC4 后台截图

    到目前完成的页面截图,完成了增删改查几项功能的技术测试,在解决几个小问题,就重新设计结构开始一个完整的后台开发,坚持用博客和云笔记记录开发过程.

  6. swift - 3D 视图,截图,关键字搜索

    1.xib 上的 3D效果 按钮 2. import UIKit //1.导入框架 import MapKit class ViewController: UIViewController { @IB ...

  7. c# 根据窗口截图,合并图片

    c# 根据窗口截图,合并图片 public class CaptureWindows { #region 类 /// <summary> /// Helper class containi ...

  8. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

  9. selenium基础(窗口截图)

    窗口截图 目的:当脚本执行出错时对当前窗口进行截图 方法:get_screenshot_as_file() #打开百度首页,搜索“selenium",完成后进行截图,并将结果保存至D:/te ...

随机推荐

  1. 014_mac下的端口查看

    一. 使用netstat去过滤listen效果不怎么理想. $ netstat -an|grep -i --color "listen" tcp6 0 0 ::1.5601 *.* ...

  2. 001_docker-compose构建elk环境

    由于打算给同事分享elk相关的东西,搭建配置elk环境太麻烦了,于是想到了docker.docker官方提供了docker-compose编排工具,elk集群一键就可以搞定,真是兴奋.好了下面咱们开始 ...

  3. maven:多个镜像配置

    <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>nexus-aliyun</mi ...

  4. HTTPS那-攻击实例与防御

    在<HTTPS-SSL证书>我描述了使用SSL证书时一些需要注意的安全问题,在这一篇文章里面我再演示一下针对HTTPS攻击的一些实例,通过这些实例能更安全的使用HTTPS.知己知彼百战不殆 ...

  5. Workman启动失败的解决方法 stream_socket_server() has been disabled for security reasons

    1.报如下错误,问题是php版本太低 php -ini 看下你的版本 http://doc2.workerman.net/how-distributed.html 参考: https://blog.c ...

  6. RocketMQ 部署

    1. 下载 下载RocketMQwget https://github.com/alibaba/RocketMQ/releases/download/v3.2.6/alibaba-rocketmq-3 ...

  7. PHP字符串指定位置插入字符串

    1.substr_replace(string,replacement,start,length);需插入时设置length为0即可 string 必需.规定要检查的字符串. replacement ...

  8. Marriage is Stable HDU1522 稳定婚姻问题基础

    几对男女   给出每个人心中的优先级   进行最合理的匹配 要打印名字的话必须有一个名字数组 英文名用map 稳定婚姻问题: 每次循环遍历所有的男的 每个男的对目前未被拒绝的并且优先级最高的进行预匹配 ...

  9. 样式加载不出来,浏览器控制台报错:Resource interpreted as Stylesheet but transferred with MIME type text/html

    写登录的时候出现的问题,样式时好时坏,浏览器控制台看到的信息是: Uncaught SyntaxError: Unexpected token <Resource interpreted as ...

  10. 使用Vmware安装linux且配置终端可以连接虚拟机总结

    首先是下载一个linux镜像,我下载的是:ubuntu-16.04.2-desktop-amd64.iso 1.使用vmware安装linux,都使用默认的配置就行了,最多改一下主机名什么的,密码最好 ...