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[256] ;
 17 } m_bminfo; // 用来保存位图信息的结构
 18
 19 int DX_Init() {// DirectX初始化。返回当前表面获取一张屏幕位图的存储空间大小
 20     HRESULT hr;
 21
 22     // 初始化directX
 23     hr = DirectDrawCreate(0, &lpDD, 0);
 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, 0);
 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 = 0;
 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 > 8)
 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, 0);
 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 32:
 74     case 24:
 75        // Update the bitmapinfo header
 76        m_b24 = TRUE;
 77        m_bminfo.bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
 78        m_bminfo.bmi.bmiHeader.biWidth = 1024;
 79        m_bminfo.bmi.bmiHeader.biHeight = 768;
 80        m_bminfo.bmi.bmiHeader.biPlanes = 1;
 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)/8);
 84        m_bminfo.bmi.bmiHeader.biXPelsPerMeter = (1024*1000)/1024;
 85        m_bminfo.bmi.bmiHeader.biYPelsPerMeter = (768*1000)/768;
 86        m_bminfo.bmi.bmiHeader.biClrUsed   = 0;
 87        m_bminfo.bmi.bmiHeader.biClrImportant = 0;
 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=0;
 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 = 1;
131    bi.biBitCount      = bitmap->bmBitsPixel*8;
132    bi.biCompression   = BI_RGB;
133    bi.biSizeImage     = 0;
134    bi.biXPelsPerMeter = 0;
135    bi.biYPelsPerMeter = 0;
136    bi.biClrUsed       = 0;
137    bi.biClrImportant  = 0;
138    fh = CreateFile(lpFileName, GENERIC_WRITE, 0, 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 = 0;
143    bmfHdr.bfReserved2 = 0;
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,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY);
176     bb.bmWidth=dwX;
177     bb.bmHeight =dwY;
178     bb.bmPlanes = 1;
179     bb.bmWidthBytes=bb.bmWidth*3;
180     bb.bmBitsPixel=3;
181     bb.bmType=0;
182     b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
183     b.bmiHeader.biWidth        =dwX;
184     b.bmiHeader.biHeight       =dwY;
185     b.bmiHeader.biPlanes       =1;
186     b.bmiHeader.biBitCount     =3*8;
187     b.bmiHeader.biCompression  =BI_RGB;
188     b.bmiHeader.biSizeImage    =0;
189     b.bmiHeader.biXPelsPerMeter=0;
190     b.bmiHeader.biYPelsPerMeter=0;
191     b.bmiHeader.biClrUsed      =0;
192     b.bmiHeader.biClrImportant =0;
193     b.bmiColors[0].rgbBlue     =8;
194     b.bmiColors[0].rgbGreen    =8;
195     b.bmiColors[0].rgbRed      =8;
196     b.bmiColors[0].rgbReserved =0;
197     hp=GetProcessHeap();
198     lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);
199     GetDIBits(hcDC,hBitmap,0,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,0,lpBuf);
206     return true;
207 }

Drectx 3D窗口后台截图相关推荐

  1. 【python】分享一个在Windows下对应用程序python窗口后台截图的方法

    最近心血来潮想自己用python写一个图色操作游戏的脚本,于是上百度一查"python后台截图",事实上能用的也就是pywin32读取内存截图(什么设备环境.设备描述表.内存设备描 ...

  2. c语言从指定窗口截图,c++ 屏幕截图指定窗口句柄后台截图返回位图句柄

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

  3. python 常用win32api 后台截图 后台鼠标 后台键盘 后台输入文字 剪切板

    依赖包 import win32gui, win32con, win32api,win32ui from win32clipboard import * import cv2 获得焦点 win32ap ...

  4. QQ2006Beta1新功能3D秀更多截图曝光(转)

    QQ2006Beta1新功能3D秀更多截图曝光(转) 几天前我们看到了腾讯QQ2006Beta1的新功能3D秀的截图.现在又有一批新的更详细的图片,请大家欣赏. 另外,据小编得到的消息,QQ2006B ...

  5. nodejs运行环境配置并使用puppeteer实现后台截图

    本文目的 不知道小伙伴们有没有遇到过后台截图这样的需求,今天我将自己的经验总结出来分享给大家. 在经过前期的技术调研之后,确定了使用nodejs的puppeteer库实现后台截图,并通过java Ru ...

  6. c语言程序窗口后台持续监测,用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序...

    /*这是一个后台运行的.每隔30s检查一次的.带有日志功能的断网重新连接程序. 要想使用它必须要配置好c语言环境,比如安装有mingw的codeblocks 实现的方式就是每隔一段时间就去ping一下 ...

  7. delphi 鼠标获取窗口句柄_Python 脚本自动对窗口进行截图

    利用Python自带的win32api和win32con.win32gui等模块,我们能执行许多windows下的自动化操作.比如两个窗口的自动点击操作,从软件中的窗口复制文本到txt中,甚至是截图操 ...

  8. linux文字命令窗口怎样截图,命令行中截图的小工具 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...

    Linux 桌面上有许多用于截屏的优秀工具,比如 Ksnapshot[1] 和 Shutter[2] .甚至 GNOME 桌面自带的简易截屏工具也能够很好的工作.但是,如果你很少截屏,或者你使用的 L ...

  9. 关于AERO或WB主题等半透明窗口无法截图的解决

    最近试过几套截图软件,发现其中有些无法实现对半透明窗口或主题的图片截取,包括早期版本的QQ截图工具也无法截取,于是打算写一个简单抓屏函数的来测试下,以下采用Win32 API方式编写: HBITMAP ...

最新文章

  1. 水晶报表左侧树不显示属性设置
  2. 基础补充:使用xlrd模块读取excel文件
  3. 暑期总结之--c#界面设计作业Mini U-NET(多图杀猫)
  4. 弱电机房保温棉知识汇总,它的种类及使用你懂多少?
  5. Json 时间 转换为 Javascript 时间 Date Jquery 调用WCF
  6. 关Jquery判断input type=checkbox元素是否被选中的判断
  7. 绕过安全沙箱限制加载在线图片
  8. ORA-28056:Writing audit records to Windows EventLog failed的问题
  9. Objective-C的算术表达式
  10. 基于Docker的开发模式驱动持续集成落地实施
  11. 强大的 actuator 服务监控与管理
  12. 【C语言】03-第一个C程序代码分析
  13. 数据分析师说坐飞机安全么
  14. EINT DINT ERTM DRTM EALLOW EDIS ESTOP0的理解
  15. gif在线转换html,在线mp4转换gif
  16. 40款非常漂亮的免费下载 HTML5 CSS3 网站模板欣赏
  17. Eclipse更换护眼背景色——传说中的绿豆沙
  18. 欧拉恒等式:数学史上的真正完美公式!
  19. 你是外包,麻烦不要偷吃零食。。注意素质!
  20. IDEA设置多行标签页

热门文章

  1. python3扫雷代码_GitHub - pantaduce/minesweeper: Python代码编写的扫雷游戏
  2. mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务
  3. java返回值变为文件_Java 文件操作-File
  4. Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
  5. 爆改100多元卡西欧,可测速、测温、测海拔,一点不输智能运动表
  6. 未来,谁来为AI开源买单?科技圈顶级码农是这样看的 | CCF C³-04@百度
  7. 如果没有StyleGAN2,真以为初代就是巅峰了:英伟达人脸生成器高能进化,弥补重大缺陷...
  8. python数据挖掘试题四十道,你敢来挑战吗?
  9. 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
  10. fiddler+android抓包工具配置使用