0
IDirect3DDevice9インターフェイスの現在のメソッドをフックして、ビデオキャプチャを開始したいと考えています。IDirect3DSurface9の失敗したLockRect
私は表面をロックしないように見えるこの作品
if (GetAsyncKeyState('O') & 1) {
pDevice->CreateOffscreenPlainSurface((rect.right - rect.left),(rect.bottom - rect.top),D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM,&back_buffer, NULL);
pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back_buffer);
D3DXSaveSurfaceToFile(L"C:\\screenshot.bmp", D3DXIFF_BMP, back_buffer, 0, NULL);
IDirect3DSurface9_Release(back_buffer);
}
ようscreenshootを取ります。
HRESULT APIENTRY hook_Present(IDirect3DDevice9* pDevice, const RECT* pSourceRect,const RECT* pDestRect, HWND hDestWindowOverride,const RGNDATA* pDirtyRegion) {
IDirect3DSurface9*back_buffer;
D3DDEVICE_CREATION_PARAMETERS cparams;
RECT rect;
pDevice->GetCreationParameters(&cparams);
GetClientRect(cparams.hFocusWindow, &rect);
if (GetAsyncKeyState('R') & 1) {
if(dx9Capturing == 0) {
//Create the AVI file
// etc code
dx9Capturing = 1
}
else if(dx9Capturing == 1) dx9Capturing = 2; // stop capturing
}
if(dx9Capturing == 1) {
// Capture the current frame
pDevice->CreateOffscreenPlainSurface((rect.right - rect.left),(rect.bottom - rect.top),D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM,&back_buffer, NULL);
pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back_buffer);
D3DLOCKED_RECT lockedRect;
if(FAILED(back_buffer->LockRect(&lockedRect,&rect,D3DLOCK_READONLY))) {
MessageBoxA(NULL, "Failed locking the back buffer!", "Error", MB_OK);
return orig_Present(pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}
for(int i=0;i<rect.bottom;i++)
{
memcpy((BYTE*)pBits+(rect.bottom-i-1)*rect.right*BITSPERPIXEL/8,(BYTE*)lockedRect.pBits+i*lockedRect.Pitch,rect.right*BITSPERPIXEL/8);
}
back_buffer->UnlockRect();
pAviFile->AddNewFrame(rect.right,rect.bottom,pBits);
}
return orig_Present(pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}
を取得し、私は私もカントpDevice-> GetFrontBufferData(0、offscreen_surface))表面 –
にgetDescを呼び出すときに、私はまた失敗し、GetFrontBufferDataは失敗します。.. 。 –
また、私はなぜGetCreationParametersを使用するのか、現在のGetAdapterDisplayModeを使用できません。 –