抓取桌面的几种方式里面,有GDI,direct3d, win10 的DXGI ,等等

以下代码已经在gitee上,使用direct3d方式抓屏,保存png方式图片,可自行下载,代码里面还有一些抓取音频的,这些还没有整理,空了就整理这些代码

https://gitee.com/guanzhi0319/capture

#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")

类声明

class ScreenCapture9
{private://HWND _hwnd = NULL;int _initbitmap = 0;BITMAPINFO _bitmapinfo;HDC _hMemDC = NULL;HDC _hDC = NULL;HBITMAP _hMemDCBitmap = NULL;BYTE * _pPixel = NULL;HCURSOR _hcur;//varsIDirect3D9*          g_pD3D = NULL;IDirect3DDevice9*    g_pd3dDevice = NULL;IDirect3DSurface9* g_pSurface = NULL;HWND             ghWnd = NULL;RECT              gScreenRect = { 0,0,0,0 };UINT             gPitch = 0;void AddMouse(HDC hMemDC);HRESULT GrabImage(void* bitmap);//显示器个数UINT _DisplayCount = 1;
public:ScreenCapture9();~ScreenCapture9();//第几个显示器HRESULT   InitD3D(HWND hWnd,int nDisplay);UINT GetPitch();UINT GetHeight();UINT GetWidth();BYTE* Grab2Hwnd();void Cleanup();int InitDisplayCount();//void test();
};

实现,注意抓取鼠标的方式有一点小问题,可自行修改

#include "ScreenCapture9.h"#include "DGIWPlus.h"
//#include <d3dx9.h>ScreenCapture9::ScreenCapture9()
{CURSORINFO globalCursor;globalCursor.cbSize = sizeof(CURSORINFO); // could cache I guess...::GetCursorInfo(&globalCursor);_hcur = globalCursor.hCursor;//GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
}ScreenCapture9::~ScreenCapture9()
{//GdiplusShutdown(m_gdiplusToken);
}int ScreenCapture9::InitDisplayCount()
{if (g_pD3D == NULL){if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL){printf_s("Unable to Create Direct3D\n");return E_FAIL;}}_DisplayCount = g_pD3D->GetAdapterCount();return _DisplayCount;
}HRESULT    ScreenCapture9::InitD3D(HWND hWnd,int nDisplay)
{D3DDISPLAYMODE ddm;D3DPRESENT_PARAMETERS   d3dpp;if (g_pD3D == NULL){if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL){printf_s("Unable to Create Direct3D\n");return E_FAIL;}_DisplayCount = g_pD3D->GetAdapterCount();}if (nDisplay > _DisplayCount - 1){nDisplay = D3DADAPTER_DEFAULT;}if (FAILED(g_pD3D->GetAdapterDisplayMode(nDisplay, &ddm))){printf_s("Unable to Get Adapter Display Mode\n");return E_FAIL;}//g_pD3D->setAZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));d3dpp.Windowed = true;d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;d3dpp.BackBufferFormat =  ddm.Format;int width = ddm.Width; // rect.right - rect.left;int height = ddm.Height; // rect.bottom - rect.top;
#if 1d3dpp.BackBufferHeight = gScreenRect.bottom = ddm.Height;d3dpp.BackBufferWidth = gScreenRect.right = ddm.Width;
#endif
#if 0//gScreenRect = rect;d3dpp.BackBufferHeight = ddm.Height;// rect.bottom - rect.top;d3dpp.BackBufferWidth = ddm.Width;  // rect.right - rect.left;
#endifd3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.hDeviceWindow = hWnd;d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;if (FAILED(g_pD3D->CreateDevice(nDisplay, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,//D3DCREATE_HARDWARE_VERTEXPROCESSING , &d3dpp, &g_pd3dDevice))){printf_s("Unable to Create Device\n");return E_FAIL;}ghWnd = hWnd;if (FAILED(g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8,D3DPOOL_SCRATCH, &g_pSurface, NULL))){printf_s("Unable to Create Surface\n");return E_FAIL;}D3DLOCKED_RECT lockedRect;if (FAILED(g_pSurface->LockRect(&lockedRect, NULL, 0)))                   // compute the required buffer size{printf_s("Unable to Lock Surface\n");return E_FAIL;}gPitch = lockedRect.Pitch;if (FAILED(g_pSurface->UnlockRect())){printf_s("Unable to Unlock Surface\n");return E_FAIL;}return S_OK;
}UINT ScreenCapture9::GetPitch()
{return gPitch;
}UINT ScreenCapture9::GetHeight()
{return gScreenRect.bottom - gScreenRect.top;
}UINT ScreenCapture9::GetWidth()
{return gScreenRect.right -gScreenRect.left;
}void ScreenCapture9::AddMouse(HDC hMemDC) {//  __int64 start = StartCounter();POINT p;GetCursorPos(&p);ICONINFO iconinfo;BOOL ret = ::GetIconInfo(_hcur, &iconinfo); // 0.09msif (ret) {p.x -= iconinfo.xHotspot; // align mouse, I guess...p.y -= iconinfo.yHotspot;// avoid some memory leak or other...if (iconinfo.hbmMask) {::DeleteObject(iconinfo.hbmMask);}if (iconinfo.hbmColor) {::DeleteObject(iconinfo.hbmColor);}}DrawIcon(hMemDC, p.x, p.y, _hcur); // 0.042ms//if (show_performance)//  LocalOutput("add mouse took %.02f ms", GetCounterSinceStartMillis(start)); // sum takes around 0.125 ms
}HRESULT ScreenCapture9::GrabImage(void* pBits)
{if (FAILED(g_pd3dDevice->GetFrontBufferData(0, g_pSurface))){printf_s("Unable to get Buffer Surface Data\n");return E_FAIL;}/*static int i = 0;TCHAR buffer[256];wsprintf(buffer, L"CaptureScreenByDirectDraw%d.bmp",i);*///D3DXSaveSurfaceToFile(buffer, D3DXIFF_BMP, g_pSurface, NULL, NULL);//HDC hdc;//HRESULT hok = g_pSurface->GetDC(&hdc);//if (hok == S_OK)//{//AddMouse(hdc);//}D3DLOCKED_RECT  lockedRect;if (FAILED(g_pSurface->LockRect(&lockedRect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK | D3DLOCK_READONLY))){printf_s("Unable to Lock Front Buffer Surface\n");return E_FAIL;}errno_t err;int height = gScreenRect.bottom - gScreenRect.top ;err = memcpy_s((BYTE*)pBits, lockedRect.Pitch*height, (BYTE*)lockedRect.pBits, lockedRect.Pitch*height);if (err){printf_s("Error executing memcpy_s.\n");}if (FAILED(g_pSurface->UnlockRect())){printf_s("Unable to Unlock Front Buffer Surface\n");return E_FAIL;}//g_pSurface->ReleaseDC(hdc);return S_OK;
}
#if 0
HRESULT ScreenCapture9::Reset()
{D3DDISPLAYMODE ddm;D3DPRESENT_PARAMETERS   d3dpp;if (g_pSurface)                                                           //Release the Surface - we need to get the latest surface{g_pSurface->Release();g_pSurface = NULL;}if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm)))  //User might have changed the mode - Get it afresh{printf_s("Unable to Get Adapter Display Mode");return E_FAIL;}//if (FAILED(g_pD3D->GetAdapterDisplayMode(1, &ddm))) //User might have changed the mode - Get it afresh//{// printf_s("Unable to Get Adapter Display Mode");// return E_FAIL;//}ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));d3dpp.Windowed = true;d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;d3dpp.BackBufferFormat = ddm.Format;d3dpp.BackBufferHeight = gScreenRect.bottom = ddm.Height;d3dpp.BackBufferWidth = gScreenRect.right = ddm.Width;d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.hDeviceWindow = ghWnd;d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;if (FAILED(g_pd3dDevice->Reset(&d3dpp))){printf_s("Unable to Reset Device");return E_FAIL;}if (FAILED(g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, /*D3DFMT_R8G8B8*/ D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL))){printf_s("Unable to Create Surface");return E_FAIL;}return S_OK;
}
#endif
void ScreenCapture9::Cleanup()
{if (g_pSurface){g_pSurface->Release();g_pSurface = NULL;}if (g_pd3dDevice){g_pd3dDevice->Release();g_pd3dDevice = NULL;}if (g_pD3D){g_pD3D->Release();g_pD3D = NULL;}//if (_pPixel != NULL)// delete[]_pPixel;if(_hMemDC!=NULL)DeleteDC(_hMemDC);if(_hMemDCBitmap!=NULL)DeleteObject(_hMemDCBitmap);
}BYTE* ScreenCapture9::Grab2Hwnd()
{int width = GetWidth();int height = GetHeight();int biBitCountchar = 32;if (_initbitmap == 0){HDC hDC = GetDC(ghWnd);_initbitmap = 1;ZeroMemory(&_bitmapinfo, sizeof(BITMAPINFO));BITMAPINFOHEADER &bmiHeader = _bitmapinfo.bmiHeader;bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmiHeader.biWidth = width;bmiHeader.biHeight = 0 - height;bmiHeader.biPlanes = 1;bmiHeader.biBitCount = biBitCountchar; // 32  24; bmiHeader.biXPelsPerMeter = 0;bmiHeader.biYPelsPerMeter = 0;bmiHeader.biSizeImage = width*height;bmiHeader.biClrUsed = 0;bmiHeader.biClrImportant = 0;_hMemDC = CreateCompatibleDC(hDC);_hMemDCBitmap = CreateDIBSection(_hMemDC, &_bitmapinfo, DIB_RGB_COLORS, (void**)&_pPixel, NULL, 0);SelectObject(_hMemDC, _hMemDCBitmap);DeleteDC(hDC);}GrabImage(_pPixel);AddMouse(_hMemDC);//memcpy(_pPixel, pData, width*height*biBitCountchar / 8);//if (hWnd != NULL)//{//BitBlt(hDC, 0, 0, width, height, _hMemDC, 0, 0, SRCCOPY);//}return _pPixel;//pDestBuffer->Release();
}

main函数开始抓屏幕

int main()
{ScreenCapture9* screenCapture9 = new ScreenCapture9();RECT rect = { 0,0,1920,1080 };screenCapture9->InitD3D(NULL,0);int w = screenCapture9->GetPitch();int h = screenCapture9->GetHeight();//void* bitmap = malloc(w*h);//WCHAR file[100];char file[100]; GUID GUID_ContainerFormat = GUID_ContainerFormatPng;      //Change the container format according to the file format we use eg:BmpBYTE *bitmap;for (int i = 0; i < 100; i++){DWORD t1 = GetTickCount();bitmap = screenCapture9->Grab2Hwnd();DWORD t2 = GetTickCount();int len = screenCapture9->GetWidth() * 4 * screenCapture9->GetHeight();
#if 0printf("the time is %d\n", t2 - t1);char * pbuffer = NULL;int retlen = BMP2JPEG((char*)bitmap, len, &pbuffer);if (pbuffer != NULL){FILE * fp;sprintf(file, "content\\GrabbedImage%d.jpg", i + 1);fp = fopen(file, "wb");if (fp != NULL){fwrite(pbuffer, retlen, 1, fp);fclose(fp);}}
#endif//wsprintf(file, L"content\\GrabbedImage%d.png", i + 1);//sprintf(file, "content\\GrabbedImage%d.bmp", i + 1);//DGIPicStorage::SaveRgb2Bmp((char*)bitmap, screenCapture9->GetWidth(), screenCapture9->GetHeight(),32, file);//SavePixelsToFile32bppPBGRA(screenCapture9->GetWidth(), screenCapture9->GetHeight(), screenCapture9->GetPitch(), (BYTE*)bitmap, file, GUID_ContainerFormatBmp);SavePixelsToFile32bppPBGRA(screenCapture9->GetWidth(), screenCapture9->GetHeight(), screenCapture9->GetPitch(), (BYTE*)bitmap, file, GUID_ContainerFormatPng);}//free(bitmap);screenCapture9->Cleanup();return 0;
}

https://gitee.com/guanzhi0319/capture

d3d9 抓取windows屏幕相关推荐

  1. 一个抓取电脑屏幕的小控件台程序

    一个抓取电脑屏幕的小控件台程序 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  2. 远程控制篇:抓取远程屏幕图像

    远程控制篇:抓取远程屏幕图像 {抓屏幕图像,保存为内存流--BMP流,压缩BMP流,JPG流,以及使用流} {在网络中传送BMP流和JPG流的速度没测试过} {BMP流的压缩是无损压缩} { 全局变量 ...

  3. php屏幕抓取,关于屏幕抓取:如何在PHP中实现Web scraper?

    哪些内置的PHP函数对Web抓取有用?有什么好的资源(web或print)可以提高PHP的web抓取速度? 我想推荐我最近遇到的这门课.简单HTML DOM分析器 对于这一点,PHP是一种特别糟糕的语 ...

  4. c++ 抓取桌面屏幕并转为jpg图片

    抓取屏幕代码 char* getScreen(unsigned long &jpg_size){ HWND DeskWnd=::GetDesktopWindow();//获取桌面窗口句柄REC ...

  5. Java抓取电脑屏幕

    2019独角兽企业重金招聘Python工程师标准>>> 据说这段代码可以获取电脑屏幕,实现抓屏效果 package org.csmn.app;import java.awt.Dime ...

  6. java获取屏幕_抓取当前屏幕信息

    [java]代码库import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import ...

  7. 笔记10:时时屏幕抓取小程序

    今天无意间看到了一边关于黑客的制作木马病毒的文章感觉还蛮有意思的. 里面有一个说到做一个木马病毒,可以时时抓取别人电脑的屏幕内容,然后我灵机一动 就想能不能用我们现在学的C#和winfrom也写个程序 ...

  8. 20個網頁抓取工具快速抓取網站

    網絡爬行(也稱為網絡抓取,屏幕抓取)已廣泛應用於當今的許多領域. 在網絡爬蟲工具進入公眾之前,對於沒有編程技能的普通人來說,這是一個神奇的詞. 它的高門檻阻礙了大數據門外的人們. 網絡抓取工具是自動爬 ...

  9. 读文读报1——上线提权抓取明文密码

    文章目录 总结 读文读报 "Shodan插件探测到81端口" "杀软探测,查看是否存在AV" "目标出网,直接powershell上线" & ...

最新文章

  1. OpenGL Tessellation and Geometry Shaders镶嵌和几何着色器的实例
  2. vscode中安装webpack_VSCode下手动构建webpack项目(示例代码)
  3. 用c语言简单办法做一个字典_幼儿园手工,用废纸筒做一个简单的小蝴蝶,有教程...
  4. 【布莱克智讯之声公众号】 精彩图文分类导航
  5. #define 与 typedef
  6. yii 定义controller model
  7. DataGridView 设置行不可见时,与货币管理器的位置关联的行不能设置为不可见
  8. autocoder自动代码生成器_Spring Boot 集成MyBatis Plus代码生成器
  9. 杰理之出现一拖二通话下第二台手机通话近端听不见远端说话【篇】
  10. 多个jdk配置环境变量
  11. SE3可能是苹果最失败的手机,销量不达预期致上市半月降价促销
  12. CNN实现简单语音识别(单词识别)
  13. coodblock调试_codeblocks怎么调试?
  14. 深度测评小程序跨端开发框架
  15. s一般怎么称呼自己的m_教师节到了,聊一聊该怎么称呼尊敬的老师
  16. 知识产权侵权警告通知函范本要如何写
  17. jQuery引起的用layer弹出层上传文件不能获取文件名的解决(thinkphp5)
  18. Linux中编写Shell脚本
  19. 使用Xunit进行单元测试
  20. redis 十一. IO 多路复用

热门文章

  1. MFC开发IM-第二篇、MFC picture 控件的用法
  2. 央视报道短视频侵权 呼吁多方配合保护影视版权
  3. 同程旅行春节旅行数据:冬奥会带火冰雪游 90、00后预订占比过半
  4. 可口可乐开了家网店卖奶,价值62亿元
  5. 三星Galaxy S22系列可能会延迟发售:原因可能还是它!
  6. 分房变卖房?董明珠承诺的3700套房即将交付,或将按成本价卖给员工
  7. 腾讯的抖音官号被封杀了?抖音回应:谣言
  8. Soul递交IPO招股书:腾讯为第一大股东,依然处于亏损状态
  9. Redmi K40游戏增强版外观配置前瞻:价格成唯一悬念!
  10. 腾讯旗下微保被罚12万元 相关责任人受到警告处分