【问题标题】:Screenshot of game window游戏窗口截图
【发布时间】:2013-07-31 06:31:07
【问题描述】:

如何在 C++ 中截取全屏游戏的屏幕截图?我知道它可以用directx 来完成,并且我编写了一个简单的代码,可以截取窗口的屏幕截图,但我不知道如何获得游戏的HWND。 这是我的代码。

#include <d3dx9.h>
#include <d3dx9tex.h>
#include <stdio.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

int main()
{
    IDirect3DSurface9 *surface;
    IDirect3DDevice9 *g_pd3dDevice;
    IDirect3D9 *g_pD3D;
    D3DDISPLAYMODE d3ddm;
    D3DPRESENT_PARAMETERS d3dpp;
    HWND hWnd = GetConsoleWindow();

    if((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
    {
        printf("fail 1");
    }

    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        printf("fail 2");
    }

    ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));

    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;
    d3dpp.BackBufferHeight = d3ddm.Height;
    d3dpp.BackBufferWidth = d3ddm.Width;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
                                   D3DDEVTYPE_HAL, hWnd,
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                   &d3dpp, &g_pd3dDevice)))
    {
        printf("fail 3");
    }
    g_pd3dDevice->CreateOffscreenPlainSurface(800, 600, D3DFMT_A8R8G8B8,     D3DPOOL_SCRATCH, &surface, NULL);
    g_pd3dDevice->GetFrontBufferData(0, surface);
    D3DXSaveSurfaceToFile("c:\\tmp\\output.jpg", D3DXIFF_JPG, surface, NULL, NULL);
    surface->Release();
    return 0;
}

【问题讨论】:

标签: c++ directx screenshot


【解决方案1】:

我对 Direct3D 没有任何经验,但对 OpenGL 没有任何经验。 但两种 API 都提供几乎相同的功能。

您应该将后台缓冲区(使用 Direct3D 而不是某些 Windows 功能)读回主机内存。然后只需使用图像库或类似的东西将该位图保存到文件中。

这其实是一个极其简单的过程。

这两个链接可能对您有帮助:
http://www.mvps.org/directx/articles/screengrab.htm
How to save backbuffer to file in DirectX 10?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多