【问题标题】:Taking screenshot C++ directx gets black image截图 C++ directx 得到黑色图像
【发布时间】:2011-07-16 15:58:27
【问题描述】:

我正在尝试使用 directx 进行屏幕截图。我尝试了几页中的代码,这些代码解释了如何但总是得到黑屏。如果有人可以帮助我,我将不胜感激。

我的代码是:

int _tmain(int argc, _TCHAR* argv[])
{
    IDirect3DDevice9* g_pd3dDevice;
    //SaveScreenShot("test.bmp",D3DXIFF_BMP);   
    IDirect3DSurface9* pSurface=NULL;
    //IDirect3DSurface9* pSource=NULL;
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferWidth = 1280;
    d3dpp.BackBufferHeight = 1024;
    d3dpp.hDeviceWindow = GetDesktopWindow();
    d3dpp.FullScreen_RefreshRateInHz=0;
    d3dpp.MultiSampleQuality=0;
    IDirect3D9* direct=Direct3DCreate9(D3D9b_SDK_VERSION);
    direct->CreateDevice(D3DADAPTER_DEFAULT,
                         D3DDEVTYPE_HAL,
                         GetDesktopWindow(),
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                         &d3dpp,&g_pd3dDevice);


    //g_pd3dDevice->GetRenderTarget(0,&pSource);
    g_pd3dDevice->CreateOffscreenPlainSurface(1280, 1024,
        D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL);
    g_pd3dDevice->GetFrontBufferData(0, pSurface);
    /*g_pd3dDevice->GetRenderTargetData(pSource,pSurface);
    g_pd3dDevice->GetRenderTargetData(pSource,pSurface);*/
    D3DXSaveSurfaceToFile("Desktop.jpg",D3DXIFF_JPG,pSurface,NULL,NULL);
    pSurface->Release();
    //pSource->Release();
    return 0;
}

【问题讨论】:

    标签: c++ visual-c++ directx screenshot direct3d9


    【解决方案1】:

    尝试添加一些错误处理,也许您会知道它失败的原因。

    【讨论】:

      【解决方案2】:

      我认为代码显示黑色屏幕截图是因为您正在尝试保存前端缓冲区,在您调用 D3DXSaveSurfaceToFile() 时该缓冲区为空。您应该先调用 IDirect3dDevice9::Present(),或者执行以下操作:

      • 在设备的后台缓冲区中绘制您想要的任何内容
      • 获取后台缓冲区的 DC 句柄(源代码)
      • 通过调用 BitBlt 使用 GDI,将源 DC 的内容复制到目标 DC,然后您可以将其写入文件、打印等。

      Direct3D 不会提供您在屏幕上看到的内容(至少根据我的经验!),只会提供创建它的窗口客户区的内容。

      【讨论】:

        猜你喜欢
        • 2013-04-03
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 2015-06-20
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多