2017-12-21 50 views
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); 
} 
+0

を取得し、私は私もカントpDevice-> GetFrontBufferData(0、offscreen_surface))表面 –

+0

にgetDescを呼び出すときに、私はまた失敗し、GetFrontBufferDataは失敗します。.. 。 –

+0

また、私はなぜGetCreationParametersを使用するのか、現在のGetAdapterDisplayModeを使用できません。 –

答えて

0

誰もが答えを知っている?私は0x8876086C(D3DERR_INVALIDCALL)

関連する問題