Take screenshot of DirectX full-screen application

后端 未结 7 1361
傲寒
傲寒 2020-11-28 06:09

This boggles me. DirectX bypasses everything and talks directly to the device driver, thus GDI and other usual methods won\'t work - unless Aero is disabled (or unavailable

7条回答
  •  囚心锁ツ
    2020-11-28 06:58

    Following J99's answer, I made the code work for both windowed and fullscreen modes. It is also done in D3D9.

      IDirect3DSurface9* surface;
      D3DDISPLAYMODE mode;
      pDev->GetDisplayMode(0, &mode); // pDev is my *IDirect3DDevice
      // we can capture only the entire screen,
      // so width and height must match current display mode
      pDev->CreateOffscreenPlainSurface(mode.Width, mode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &surface, NULL);
      if(pDev->GetFrontBufferData(0, surface)==D3D_OK)
      {
        if(bWindowed) // a global config variable
        {
          // get client area in desktop coordinates
          // this might need to be changed to support multiple screens
          RECT r;
          GetClientRect(hWnd, &r); // hWnd is our window handle
          POINT p = {0, 0};
          ClientToScreen(hWnd, &p);
          SetRect(&r, p.x, p.y, p.x+r.right, p.y+r.bottom);
          D3DXSaveSurfaceToFile(szFilename, D3DXIFF_JPG, surface, NULL, &r);
        }
        else
          D3DXSaveSurfaceToFile(szFilename, D3DXIFF_JPG, surface, NULL, NULL);
      }
      surface->Release();
    

    It looks like format and pool parameters of CreateOffscreenPlainSurface must be exactly the same.

提交回复
热议问题