首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

DirectX 截屏有关问题

2012-07-18 
DirectX 截屏问题我想通过DirectX方式实现抓屏功能,包括抓取其他D3D程序的屏幕,目前是这样做的:g_pScreenC

DirectX 截屏问题
我想通过DirectX方式实现抓屏功能,包括抓取其他D3D程序的屏幕,目前是这样做的:
g_pScreenCapture->m_pd3dDevice->GetFrontBufferData(0, g_pScreenCapture->m_pSurface);
D3DLOCKED_RECTlockedRect;
if(FAILED(g_pScreenCapture->m_pSurface->LockRect(&lockedRect,&g_pScreenCapture->m_ScreenRect,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY)))
{
OutputDebugString("Unable to Lock Front Buffer Surface");
}
//处理数据
g_pScreenCapture->m_pSurface->UnlockRect();
这样可以抓到我需要的数据,但是速度很慢,在我的机器上每执行一次要50ms。我从网上找到一些资料说可以用GetBackBuffer这个方法,
HRESULT hr;
LPDIRECT3DSURFACE9 lpSurface;
if (FAILED(hr = m_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpSurface)))
{
lpSurface->Release();
return -1;
}

D3DXIMAGE_FILEFORMAT DestFormat = D3DXIFF_BMP;

LPD3DXBUFFER pDestBuf;
if (FAILED(hr = D3DXSaveSurfaceToFileInMemory(&pDestBuf, DestFormat, lpSurface, NULL, NULL)))
{
lpSurface->Release();
return -1;
}

LPBYTE lpBmp = (LPBYTE)pDestBuf->GetBufferPointer();
DWORD dwOffset = ((BITMAPFILEHEADER*)lpBmp)->bfOffBits;
int size = pDestBuf->GetBufferSize();
pDestBuf->Release();
函数执行过程都正常,但是最后Lock到的数据都是0,请问是什么原因?

[解决办法]
up
[解决办法]
Lock的flag最好就用0
[解决办法]
很怀疑这个可以保存别的3d游戏的屏幕?
[解决办法]
如果对方游戏没有禁用抓图,可以用剪贴板,如果对方禁用了,不知道了就。
[解决办法]

C/C++ code
     if (FAILED(m_BackSurface->Lock(NULL, &m_surface_desc,                                   DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL)))    {        return 0;    }    m_pTablet=(unsigned int *)m_surface_desc.lpSurface;    m_lpitch32=(int)(m_surface_desc.lPitch >> 2);       m_pTablet[pa_BackSurfaceX + pa_BackSurfaceY*m_lpitch32] = pa_BGR_byte; 

热点排行