来自全窗口游戏的 C++ DirectX CreateDevice

Posted

技术标签:

【中文标题】来自全窗口游戏的 C++ DirectX CreateDevice【英文标题】:C++ DirectX CreateDevice From Full Window Game 【发布时间】:2014-08-08 20:46:36 【问题描述】:

我正在尝试从全屏 DirectX 游戏中截取屏幕。

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

这是我的代码:

#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。

任何人都对这类事情有任何经验?也许我缺少当前参数?

【问题讨论】:

到底哪里失败了?您能否包含有关引发什么异常的信息以及失败时的任何详细信息? 实际上,directX->CreateDevice 方法根本就失败了。那个空抛出的例外。所以从技术上讲,不会抛出异常,函数只是失败了。 您查看返回码 (msdn.microsoft.com/en-us/library/windows/desktop/…) 是否知道真正的问题是什么? 【参考方案1】:

当应用程序处于全屏状态时 - 只能将 1 个设备链接到它。 由于设备已经链接到应用程序(运行应用程序的那个),我们的应用程序无法创建另一个设备

【讨论】:

以上是关于来自全窗口游戏的 C++ DirectX CreateDevice的主要内容,如果未能解决你的问题,请参考以下文章

C++ Directx 鼠标输入在失去焦点后表现怪异

使用 Direct 3D (C++) 的 DIrectX 11 2D 游戏引擎

DirectX 游戏 LPD3DX9Sprite 渲染缓慢

c++ - Win32 窗口在第一次绘制后冻结(directx 11)

挂钩/覆盖 DirectX 游戏?

Visual C++游戏开发五十七 浅墨DirectX教程二十四 打造游戏GUI界面