生活随笔
收集整理的這篇文章主要介紹了
directx9 截屏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,directx9截屏接口
Direct3DCreate9 創建directx3D對象CreateDevice:創建一個顯卡設備對象CreateOffscreenPlainSurface:創建離屏表面(一片存儲空間)GetFrontBufferData:前臺表面
LockRect函數(取表面的內容)
D3DLOCKED_RECT lr;ZeroMemory(&lr, sizeof(D3DLOCKED_RECT));pSurface -> LockRect(&lr, NULL, 0)DEORD* pBuf = (DWORD*)lr . pBits;pSurface -> UnlockRect();
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
#pragma warning (disable:4996)
#include <iostream>
using namespace std
;
void CaptureScreen(void* data
)
{static IDirect3D9
* d3d
= NULL;if (!d3d
){d3d
= Direct3DCreate9(D3D_SDK_VERSION
);}if (!d3d
)return;static IDirect3DDevice9
* device
= NULL;if (!device
){D3DPRESENT_PARAMETERS pa
;ZeroMemory(&pa
, sizeof(pa
));pa
.Windowed
= true;pa
.Flags
= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER
;pa
.SwapEffect
= D3DSWAPEFFECT_DISCARD
;pa
.hDeviceWindow
= GetDesktopWindow();d3d
->CreateDevice(D3DADAPTER_DEFAULT
, D3DDEVTYPE_HAL
, 0,D3DCREATE_HARDWARE_VERTEXPROCESSING
, &pa
, &device
);}if (!device
)return;int w
= GetSystemMetrics(SM_CXSCREEN
);int h
= GetSystemMetrics(SM_CYSCREEN
);static IDirect3DSurface9
* sur
= NULL;if (!sur
){device
->CreateOffscreenPlainSurface(w
, h
,D3DFMT_A8B8G8R8
, D3DPOOL_SCRATCH
, &sur
, 0); }if (!sur
)return;device
->GetFrontBufferData(0, sur
);D3DLOCKED_RECT rect
;ZeroMemory(&rect
, sizeof(rect
));if (sur
->LockRect(&rect
, 0, 0) != S_OK
){return;}memcpy(data
, rect
.pBits
, w
* h
* 4);sur
->UnlockRect();
}int main()
{ char* buf
= new char[1920 * 1080 * 4];FILE
* fp
= fopen("./file/out.reb", "wb");int size
= 1920 * 1080 * 4;for (int i
= 0; i
< 100; i
++){CaptureScreen(buf
);fwrite(buf
, 1, size
, fp
);Sleep(100);}return 0;
}
總結
以上是生活随笔為你收集整理的directx9 截屏的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。