2012-05-05 12 views
1

http://www.ring3circus.com/gameprogramming/case-study-fraps/ をし、私はそれが、ある(そして作者も自分のコードを使用しないことを示唆して)何歳与えられたことを実現するために来ている、これは本当にISNその私のニーズに合ったものになる(1つはC#、2つはDX9)。私は、DirectXのゲームウィンドウの長方形キャプチャを取得しようとしていると私は参照できるストリーミングビデオのいくつかの並べ替えとしてメモリに持っています。フォアグラウンドではなく、可視(他のウィンドウの後ろに埋もれている)していても、ウィンドウをキャプチャできる必要があります。私はそのC#ライブラリ(EasyHookとSlimDXで作られたもの)を試しましたが、私は64ビットのDirectX 11ゲームでデモを正常に動作させることができました(それ以来再現できませんでした)。それでも捕獲率は目が鈍っていた。 DirectXへのオーバーレイをカバーする他の多くのものと一緒に(私は必要ありません)。私は捕獲が行く限り、どのくらいのことを模倣したいのですが、私はゲーム全体ではなく長方形の領域を必要とし、ファイルに書き込む必要はありません。 DX9トラフDX11で動作するC#のゲームウィンドウの四角形を高速にフレームキャプチャする方法のコードサンプルを入手できましたか?DX9/10月11日SceenキャプチャC#の

+1

これは良い質問です。 DX9や他の無関係なソリューションの下に埋もれているネット上で、簡単に答えを見つけることはできません。 – jheriko

答えて

3

ここに同じ問題のC++コードがあります。

ID3D11Texture2D* pSurface; 
HRESULT hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pSurface)); 
if(pSurface) 
{ 
    const int width = static_cast<int>(m_window->Bounds.Width * m_dpi/96.0f); 
    const int height = static_cast<int>(m_window->Bounds.Height * m_dpi/96.0f); 
    unsigned int size = width * height; 
    if(m_captureData) 
    { 
     freeFramebufferData(m_captureData); 
    } 
    m_captureData = new unsigned char[ width * height * 4 ]; 

    ID3D11Texture2D* pNewTexture = NULL; 

    D3D11_TEXTURE2D_DESC description; 
    pSurface->GetDesc(&description); 
    description.BindFlags = 0; 
    description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
    description.Usage = D3D11_USAGE_STAGING; 

    HRESULT hr = m_d3dDevice->CreateTexture2D(&description, NULL, &pNewTexture); 
    if(pNewTexture) 
    { 
     m_d3dContext->CopyResource(pNewTexture, pSurface); 
     D3D11_MAPPED_SUBRESOURCE resource; 
     unsigned int subresource = D3D11CalcSubresource(0, 0, 0); 
     HRESULT hr = m_d3dContext->Map(pNewTexture, subresource, D3D11_MAP_READ_WRITE, 0, &resource); 
     //resource.pData; // TEXTURE DATA IS HERE 

     const int pitch = width << 2; 
     const unsigned char* source = static_cast< const unsigned char* >(resource.pData); 
     unsigned char* dest = m_captureData; 
     for(int i = 0; i < height; ++i) 
     { 
      memcpy(dest, source, width * 4); 
      source += pitch; 
      dest += pitch; 
     } 

     m_captureSize = size; 
     m_captureWidth = width; 
     m_captureHeight = height; 

     return; 
    } 

    freeFramebufferData(m_captureData); 
} 

これをC#に移植するか、少なくともライブラリでラップすることができます。私は同様の質問をしましたが、答えを見つけました:DirectX 11 framebuffer capture (C++, no Win32 or D3DX)

+1

スワップチェーンをどのように初期化するのですか?このコードを使用して他のアプリケーションの画面を取得できますか? – Cesar

+0

素晴らしい出発点は、本当に私が正しい方向を見つけるのを助けました。 – Hydra

関連する問題