19,469
社区成员
发帖
与我相关
我的任务
分享
HDC hDC=::GetDC(NULL);
HDC hMemDC=CreateCompatibleDC(hDC);
HBITMAP hBitmap=CreateCompatibleBitmap(hDC,width,height);
HBITMAP hOldBitmap;
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0,width,height,hDC,left,right,SRCCOPY);
/*先运行InitDX(),之后直接调用GetBmpFromRectDX(RECT)函数截取相应的区域即可*/
//注意:
//相对比较费时间的函数是mv_pd3dDevice->GetFrontBufferData(0, mv_pSurface);
//大概用掉50ms左右,所以不要每次截获屏幕都运行一次
////////DX
BOOL CBmpManager::InitDX()
{
///初始化变量
mv_pD3D=NULL;
mv_pd3dDevice=NULL;
mv_pSurface=NULL;
mv_screenRect.left=0;
mv_screenRect.right=0;
mv_screenRect.top=0;
mv_screenRect.bottom=0;
mv_bCapturing=false;
mv_pBits=NULL;
mv_hBackDC=NULL;
mv_hBackBitmap=NULL;
mv_hOldBitmap=NULL;
if(FAILED(InitD3D(NULL))){
AfxMessageBox(_T("Failed to InitD3D!"));
return FALSE;
}
return TRUE;
}
HRESULT CBmpManager::InitD3D(HWND hWnd)
{
D3DDISPLAYMODE ddm;
D3DPRESENT_PARAMETERS d3dpp;
if((mv_pD3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
{
AfxMessageBox(_T("Unable to Create Direct3D "));
return E_FAIL;
}
if(FAILED(mv_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm)))
{
AfxMessageBox(_T("Unable to Get Adapter Display Mode"));
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));
d3dpp.Windowed=WINDOW_MODE;
d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.BackBufferFormat=ddm.Format;
d3dpp.BackBufferHeight=mv_nDisplayHeight=mv_screenRect.bottom =ddm.Height;
d3dpp.BackBufferWidth=mv_nDisplayWidth=mv_screenRect.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(mv_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&mv_pd3dDevice)))
{
AfxMessageBox(_T("Unable to Create Device"));
return E_FAIL;
}
if(FAILED(mv_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &mv_pSurface, NULL)))
{
AfxMessageBox(_T("Unable to Create Surface"));
return E_FAIL;
}
mv_pd3dDevice->GetFrontBufferData(0, mv_pSurface);
return S_OK;
}
LPD3DXBUFFER CBmpManager::GetBmpFromRectDX(CRect cRect)
{
LPD3DXBUFFER lpD3DBuf;
RECT rect;
rect.left=cRect.left;
rect.top=cRect.top;
rect.bottom=cRect.bottom;
rect.right=cRect.right;
CString szFileName;
static int i=0;
szFileName.Format(_T("hooksBmp/ScreenShot%d.jpg"),i++);
D3DXSaveSurfaceToFile(szFileName,D3DXIFF_JPG,mv_pSurface,NULL,&rect);
//Save to File
return lpD3DBuf;
}
void CTestView::OnTest()
{
int timeDiff=0;
int times=150;
int width=1366;
int height=768;
int left=0;
int right=0;
HDC hDC=::GetDC(NULL);
HDC hMemDC=CreateCompatibleDC(hDC);
HBITMAP hBitmap=CreateCompatibleBitmap(hDC,width,height);
HBITMAP hOldBitmap;
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
LARGE_INTEGER m_liPerfFreq={0};
//获取每秒多少CPU Performance Tick
QueryPerformanceFrequency(&m_liPerfFreq);
LARGE_INTEGER liPerfStart={0};
QueryPerformanceCounter(&liPerfStart);
for(int i=0;i<times;i++){
BitBlt(hMemDC,0,0,width,height,hDC,left,right,SRCCOPY);
}
LARGE_INTEGER liPerfEnd={0};
QueryPerformanceCounter(&liPerfEnd);
int time=(((liPerfEnd.QuadPart -
liPerfStart.QuadPart) * 1000)/m_liPerfFreq.QuadPart);
CString timeStr;
timeStr.Format(_T("%d"),time/times);
AfxMessageBox(timeStr);
}
HDC hDC=::GetDC(NULL);
HDC hMemDC=CreateCompatibleDC(hDC);
HBITMAP hBitmap=CreateCompatibleBitmap(hDC,width,height);
HBITMAP hOldBitmap;
hOldBitmap=(HBITMAP)SelectObject( hMemDC,hBitmap );