C++ DirectX CreateDevice 从全窗口游戏

标签 c++ graphics directx handle directx-9

我正在尝试从全屏 DirectX 游戏中捕获屏幕。

我设法从窗口游戏中截取屏幕截图,但是当我尝试从全屏游戏创 build 备时,它会引发异常。

这是我的代码:

#include "stdafx.h"
#include <d3d9.h>
#include <d3dx9.h>
#include "DirectXTools.h"

LPDIRECT3D9 directX;
LPDIRECT3DDEVICE9 directXDevice;

void initDevice(HWND myWindow);
void ConvertCharToWC(char* src, wchar_t* target);

void DirectXTools::CaptureWindow(const char* windowName)
{
    Sleep(5000);
    HWND windowHandle = GetForegroundWindow();
    initDevice(windowHandle);
}

void initDevice(HWND myWindow) {
    D3DDISPLAYMODE  ddm;
    D3DPRESENT_PARAMETERS   d3dpp;
    IDirect3DSurface9* g_pSurface;

    if((directX=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
    {
        throw "";
    }

    if(FAILED(directX->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm)))
    {
        throw "";
    }

    ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));

    d3dpp.Windowed=FALSE;
    d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.BackBufferFormat=ddm.Format;
    d3dpp.BackBufferHeight=ddm.Height;
    d3dpp.BackBufferWidth=ddm.Width;
    d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
    //  d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.SwapEffect=D3DSWAPEFFECT_COPY;
    d3dpp.hDeviceWindow=myWindow;
    d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(directX->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,myWindow,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3dpp,&directXDevice)))
    {
        throw "";
    }

    if(FAILED(directXDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL)))
    {
        throw "";
    }

    directXDevice->GetFrontBufferData(0, g_pSurface);
    D3DXSaveSurfaceToFile("temp.bmp",D3DXIFF_BMP,g_pSurface,NULL,NULL);
}

directX->CreateDevice 函数失败,它没有抛出异常,但返回错误 D3DERR_DEVICELOST。

谁有这方面的经验?也许我缺少当前参数?

最佳答案

当应用程序是全屏时 - 只有 1 台设备可以链接到它。 由于设备已经链接到应用程序(运行应用程序的人),我们的应用程序无法创建另一个设备

关于C++ DirectX CreateDevice 从全窗口游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211985/

相关文章:

c# - 是否可以将 DirectX 的单个全屏页面添加到 XAML/C# Windows 8 商店应用程序?

optimization - DirectX 11 中的早期 Z 测试/深度测试

c++ - 使用qmake构建项目时出现"Unsupported Build Type"

opengl - OpenGL:缩放然后翻译?如何?

c++ - 请推荐一个适用于XP、Win7、Win8的二维动画c++工具

java - 了解 Android 的 Canvas.saveLayer(...)

c++ - 写入 BMP 数据变得垃圾

c++ - 如何释放我的类析构函数中的内存?

c++ - 二进制搜索以任意数量的字节编码的整数列表

C++ 游戏音效