C++ 当插入第二个监视器时,全屏Direct3D9设备仅以本机分辨率显示

C++ 当插入第二个监视器时,全屏Direct3D9设备仅以本机分辨率显示,c++,visual-c++,direct3d,direct3d9,multiple-monitors,C++,Visual C++,Direct3d,Direct3d9,Multiple Monitors,使用单个监视器时,我的程序可以使用从EnumAdapterModes选择的任何分辨率在窗口模式和全屏模式下工作,但是当我插入运行相同代码的第二个监视器时,我可以从EnumAdapterModes创建任何分辨率的全屏设备,但只有在本机分辨率1600 x 900时,它才会显示场景,否则,除了下面列出的其他问题外,屏幕就是黑色的 到目前为止,我发现: 此问题在窗口或多磁头模式下不会发生 我仍然可以渲染到一个纹理,但我必须切换模式才能显示它 所有函数调用都返回成功代码,包括TestCooperative

使用单个监视器时,我的程序可以使用从EnumAdapterModes选择的任何分辨率在窗口模式和全屏模式下工作,但是当我插入运行相同代码的第二个监视器时,我可以从EnumAdapterModes创建任何分辨率的全屏设备,但只有在本机分辨率1600 x 900时,它才会显示场景,否则,除了下面列出的其他问题外,屏幕就是黑色的

到目前为止,我发现:

此问题在窗口或多磁头模式下不会发生 我仍然可以渲染到一个纹理,但我必须切换模式才能显示它 所有函数调用都返回成功代码,包括TestCooperativeLevel 如果我尝试使用Clear或DrawPrimitive函数绘制到后缓冲区,或者调用Present(仍然留下黑屏),则对GetRenderTargetData的调用将失败,并且尝试锁定体积纹理将在子级别返回不同的切片间距 使用Direct3D9 Portal的商业游戏在插入第二个显示器的情况下在分辨率之间切换没有任何问题,因此必须有一个解决方案 问题似乎与Direct3D9运行时创建的后缓冲区有关,但我能想到的唯一解决方案是在具有多个监视器的设备上强制使用多磁头模式,有什么想法吗


这个问题似乎也有同样的问题,但缺乏解决方案:

最终解决了这个问题,这似乎是Windows Vista和更高版本中的一个驱动程序错误,使用Direct3D9Ex解决了这个问题


我不想使用Direct3D9Ex,因为它只在Windows Vista上推出,我想至少支持Windows XP,但MSDN提供了一些示例代码,说明如何支持这两种操作,所以一切都很好。

我不会担心XP,因为它在2014年4月失去了支持。另外,大多数玩家都在Windows 7上,并且有相应的硬件。我主要是一个游戏机玩家,所以我的桌面上仍然有XP,我认识一些人也有XP,但我正在开始为PC开发游戏,我现在主要使用笔记本电脑开发Windows 7,但我的笔记本电脑并不完全是一台游戏机。只是提醒一下,微软在今年4月之后将不会修补XP,而且DirectX 9目前已被正式弃用,我不希望它能像DirectX 10/11那样可靠。我使用的是基于插件的方法,我的Direct3D9插件基本上已经完成,即使它的寿命很短,它们的可替换性是为了便于移植,我将在将来编写DirectX 11和OpenGL插件。