gdi截屏
// TTTest.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "TTTest.h" #include <stdio.h> LPVOID screenCaptureData=NULL; HBITMAP hBitmap; HDC hDDC; HDC hCDC; int nWidth; int nHeight; void initGDI(){ // Get screen size nWidth = GetSystemMetrics(SM_CXSCREEN); nHeight = GetSystemMetrics(SM_CYSCREEN); screenCaptureData = new char[nWidth*nHeight*4]; memset(screenCaptureData,0,nWidth); // Get desktop DC, create a compatible dc, create a comaptible bitmap and select into compatible dc. hDDC = GetDC( GetDesktopWindow() ); hCDC = CreateCompatibleDC(hDDC); hBitmap =CreateCompatibleBitmap(hDDC,nWidth,nHeight); SelectObject(hCDC,hBitmap); } void gdiScreenCapture(LPVOID screenCaptureData){ BitBlt(hCDC,0,0,nWidth,nHeight,hDDC,0,0,SRCCOPY); GetBitmapBits(hBitmap,nWidth*nHeight*4,screenCaptureData); } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { initGDI(); gdiScreenCapture(screenCaptureData); for(int i=0 ;i<nWidth*nHeight;i++){ unsigned char b = *((char*)screenCaptureData+i*4) ; unsigned char g = *((char*)screenCaptureData+i*4+1) ; unsigned char r = *((char*)screenCaptureData+i*4+2) ; unsigned char a = *((char*)screenCaptureData+i*4+3) ; char chInput[10] ; sprintf(chInput,"x:%d y:%d A:%d R:%d G:%d B:%d\n",i%nWidth,i/nWidth,a,r,g,b); OutputDebugString( chInput ); } return 0; }
direct3d截屏
// DirectScreenCapture.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "DirectScreenCapture.h" #include <d3d9.h> #include <WinError.h> IDirect3D9* g_pD3DScreenCapture=NULL; IDirect3DDevice9* g_pd3dDevice=NULL; IDirect3DSurface9* g_pSurface=NULL; LPVOID screenCaptureData=NULL; RECT gScreenRect ={0,0,0,0}; HRESULT InitD3D() { BITMAPINFO bmpInfo; ZeroMemory(&bmpInfo,sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression = BI_RGB; bmpInfo.bmiHeader.biWidth=GetSystemMetrics(SM_CXSCREEN); bmpInfo.bmiHeader.biHeight=GetSystemMetrics(SM_CYSCREEN); bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biSizeImage=abs(bmpInfo.bmiHeader.biHeight)*bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biBitCount/8; HDC hdc=GetDC(GetDesktopWindow()); HDC hBackDC=NULL; HBITMAP hBackBitmap=NULL; hBackDC=CreateCompatibleDC(hdc); hBackBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,&screenCaptureData,NULL,0); if(hBackBitmap==NULL) { return 0 ; } ReleaseDC(GetDesktopWindow(),hdc); HWND hWnd = 0; D3DDISPLAYMODE ddm; D3DPRESENT_PARAMETERS d3dpp; if((g_pD3DScreenCapture=Direct3DCreate9(D3D_SDK_VERSION))==NULL) { return E_FAIL; } if(FAILED(g_pD3DScreenCapture->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm))) { 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=hWnd; d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; if(FAILED(g_pD3DScreenCapture->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING ,&d3dpp,&g_pd3dDevice))) { return E_FAIL; } if(FAILED(g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL))) { return E_FAIL; } return S_OK; } //direct实现的截图 void directScreenCapture(LPVOID screenCaptureData){ g_pd3dDevice->GetFrontBufferData(0, g_pSurface); D3DLOCKED_RECT lockedRect; if(FAILED(g_pSurface->LockRect(&lockedRect,&gScreenRect,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY))) { return; } for(int i=0;i<gScreenRect.bottom;i++) { memcpy((BYTE*)screenCaptureData+(i)*gScreenRect.right*32/8,(BYTE*)lockedRect.pBits+i*lockedRect.Pitch,gScreenRect.right*32/8); } g_pSurface->UnlockRect(); //printf("%d\n" , l3); } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { //初始化direct3d,用户截屏 if(FAILED(InitD3D())) return -1; directScreenCapture(screenCaptureData); unsigned char * screenData = (unsigned char *)screenCaptureData ; for(int y=0 ; y<1080 ;y++){ for(int x =0 ; x<1920 ;x ++){ int offset = (x + y * 1080) *4; unsigned char b = *(screenData + offset); unsigned char g = *(screenData + offset + 1); unsigned char r = *(screenData + offset + 2); unsigned char a = *(screenData + offset + 3); } } return 0; }
项目图:
direct截屏、c++DLL封装、c#显示,图片项目