資源簡介
windows下的抓屏組件包含了GDI,DDRAW和DXGI等多種技術的抓屏代碼
代碼片段和文件信息
#include?“../stdafx.h“
#include?“VideoDxCaptor.h“
#include?
#pragma?comment(lib?“Dwmapi.lib“)
?VideoDXCaptor::VideoDXCaptor(void)??
?{?
?m_lpDDraw?=?NULL;?
?m_lpDDSPrime?=?NULL;?
?m_lpDDSBack?=?NULL;
?}
VideoDXCaptor::~VideoDXCaptor(void)?
{?
Deinit();
}
BOOL?VideoDXCaptor::Init()
{
HMODULE?hDll?=?LoadLibrary(“ddraw.dll“);
if?(hDll?==?NULL)
{
(“無法載入ddraw.dll\n“);
return?FALSE;
}
//?載入ddraw的導入函數(shù)
PFN_DirectDrawCreate?DirectDrawCreateFunc?=?(PFN_DirectDrawCreate)GetProcAddress(hDll?“DirectDrawCreate“);
if?(DirectDrawCreateFunc?==?NULL)
{
(“無法找到訪問點:DirectDrawCreate\n“);
return?FALSE;
}
HRESULT?hr?=?DirectDrawCreateFunc(NULL?&m_lpDDraw?NULL);
if?(FAILED(hr))
{
(“DirectDrawCreate失敗\n“);
return?FALSE;
}
hr?=?m_lpDDraw->SetCooperativeLevel(NULL?DDSCL_NORMAL);
if?(FAILED(hr))
{
(“SetCooperativeLevel失敗\n“);
return?FALSE;?
}
DDSURFACEDESC?DDSdesc;
ZeroMemory(&DDSdesc?sizeof(DDSdesc));
DDSdesc.dwSize?????????=?sizeof(DDSdesc);
DDSdesc.dwFlags????????=?DDSD_CAPS;
DDSdesc.ddsCaps.dwCaps?=?DDSCAPS_PRIMARYSURFACE;
hr?=?m_lpDDraw->CreateSurface(&DDSdesc?&m_lpDDSPrime?NULL);
if?(FAILED(hr))
{
(“CreateSurface?主表面失敗\n“);
return?FALSE;?
}
ZeroMemory(&DDSdesc?sizeof(DDSdesc));
DDSdesc.dwSize??=?sizeof(DDSdesc);
DDSdesc.dwFlags?=?DDSD_ALL;
hr?=?m_lpDDSPrime->GetSurfaceDesc(&DDSdesc);
if?(FAILED(hr))
{
(“GetSurfaceDesc失敗\n“);
return?FALSE;
}
//?備份描述信息
memcpy(&m_DDSdesc?&DDSdesc?sizeof(DDSdesc));
DDSdesc.dwFlags????????=?DDSD_CAPS?|?DDSD_HEIGHT?|DDSD_WIDTH;?
DDSdesc.ddsCaps.dwCaps?=?DDSCAPS_OFFSCREENPLAIN;
hr?=?m_lpDDraw->CreateSurface(&DDSdesc?&m_lpDDSBack?0);
if?(FAILED(hr))
{
(“CreateSurface?后備表面失敗\n“);
return?FALSE;
}
return?TRUE;
}
VOID?VideoDXCaptor::Deinit()
{
if?(m_lpDDSBack)
{
m_lpDDSBack->Release();
m_lpDDSBack?=?NULL;
}
if?(m_lpDDSPrime)
{
m_lpDDSPrime->Release();
m_lpDDSPrime?=?NULL;
}
if?(m_lpDDraw)
{
m_lpDDraw->Release();
m_lpDDraw?=?NULL;
}
}
BOOL?VideoDXCaptor::CaptureImage(RECT?&rect?void?*pData?INT?&nLen)
{
if?(m_lpDDSBack?==?NULL)
{
(“DDraw對象未初始化\n“);
return?FALSE;
}
HRESULT?hr?=?m_lpDDSBack->BltFast(rect.left?rect.top?m_lpDDSPrime?&rect?DDBLTFAST_NOCOLORKEY?|?DDBLTFAST_WAIT);
if?(FAILED(hr))
{
(“BltFast失敗\n“);
return?FALSE;
}
DDSURFACEDESC?surfDesc;
ZeroMemory(&surfDesc?sizeof(surfDesc));?
surfDesc.dwSize?=?sizeof(surfDesc);
//hr?=?lpDDSPrime->Lock(&rect?&surfdesc?DDLOCK_READONLY?|?DDLOCK_WAIT?|?DDLOCK_SURFACEMEMORYPTR??NULL);
hr?=?m_lpDDSBack->Lock(&rect?&surfDesc?DDLOCK_READONLY?|?DDLOCK_WAIT?|?DDLOCK_SURFACEMEMORYPTR??NULL);
if?(FAILED(hr))
{
(“Lock失敗\n“);
return?FALSE;
}
//?這里拷貝的是32位數(shù)據(jù),我們只需要24位的RGB數(shù)據(jù)
//memcpy(pBuf?(BYTE*)surfDesc.lpSurface?surfDesc.dwWidth?*?surfDesc.dwHeight?*?surfDesc.ddpfPixelFormat.dwRGBBitCount?/?8);
//?將抓上來的圖像轉(zhuǎn)成RGB數(shù)據(jù)(
評論
共有 條評論