2012-10-14 14 views
5

के साथ बैक बफर से डेस्कटॉप का स्क्रीनशॉट कैसे प्राप्त करें मैंने how to take the screen shot in DirectX से पूछा और "GetFrontBufferData() का उपयोग करें" का उत्तर दिया गया था। हालांकि, "यह फ़ंक्शन डिज़ाइन द्वारा बहुत धीमा है, और किसी भी प्रदर्शन-महत्वपूर्ण पथ में उपयोग नहीं किया जाना चाहिए" MSDN पर वर्णित किया गया था।डायरेक्टएक्स

जब मैंने अन्य लोगों से उपाय पूछा, "बैक बफर के डेटा को सिस्टम मेमोरी में स्थानांतरित करें" का उत्तर दिया गया था। लेकिन, मैं एक ठोस विधि खोजने में सक्षम नहीं था।

यह विफलता का एक उदाहरण है। कृपया मुझे सही कोड बताएं।

#include <stdio.h> 
#include <Windows.h> 
#include <d3d9.h> 
#include <d3dx9tex.h> 

void main() 
{ 
    CoInitialize(NULL); 

    HWND hwnd = GetDesktopWindow(); 

    LPDIRECT3D9 d3d9; 
    D3DDISPLAYMODE ddm; 

    d3d9 = Direct3DCreate9(D3D_SDK_VERSION); 
    d3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm); 

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS)); 
    d3dpp.Windowed = TRUE; 
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; 
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 
    d3dpp.BackBufferCount = 1; 
    d3dpp.BackBufferWidth = ddm.Width; 
    d3dpp.BackBufferHeight = ddm.Height; 
    d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 
    d3dpp.MultiSampleQuality = 0; 
    d3dpp.EnableAutoDepthStencil = TRUE; 
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 
    d3dpp.hDeviceWindow = hwnd; 
    d3dpp.Flags = D3DPRESENTFLAG_VIDEO; 
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; 
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; 

    LPDIRECT3DDEVICE9 dev; 
    d3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp, &dev); 

    /* Deprecation 
    IDirect3DSurface9* surface = NULL; 
    dev->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surface, NULL); 
    dev->GetFrontBufferData(0, surface); 
    D3DXSaveSurfaceToFile(L"D:\\test.bmp", D3DXIFF_BMP, surface, NULL, NULL); 
    */ 

    // Transfer the data of a back buffer to the system memory 
    IDirect3DSurface9* surface = NULL; 
    dev->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &surface, NULL); 
    LPDIRECT3DSURFACE9 back = NULL; 
    dev->SetRenderTarget(0, surface); 
    dev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back); 
    dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,127), 1.0, 0); 
    dev->BeginScene(); 
    dev->StretchRect(surface, NULL, back, NULL, D3DTEXF_NONE); 
    dev->EndScene(); 
    dev->Present(0,0,0,0); 
    D3DXSaveSurfaceToFile(L"D:\\test.bmp", D3DXIFF_BMP, back, NULL, NULL); 


    if(back) back->Release(); 

    dev->Release(); 
    d3d9->Release(); 

    CoUninitialize(); 
} 

उत्तर

2

आप समारोह GetBackBuffer केवल वापस बफर के एक सूचक है, यह में नहीं डेटा पुनः प्राप्त बैक-बफर से डेटा प्राप्त नहीं कर सकता।

  • फ्रंट बफर। मेमोरी का एक आयत जिसका अनुवाद ग्राफिक्स एडाप्टर द्वारा किया गया है और मॉनीटर पर प्रदर्शित किया गया है। डायरेक्ट 3 डी में एप्लिकेशन सीधे फ्रंट बफर पर सीधे नहीं लिखता है।
  • बैक बफर। एक स्मृति का आयताकार जो एक एप्लिकेशन सीधे लिख सकता है। बैक बफर मॉनीटर पर सीधे प्रदर्शित नहीं होता है।

इसका मतलब है कि डेस्कटॉप पर जो आपने देखा वह सामने वाले बफर में मौजूद है।

संबंधित मुद्दे