屏幕锁定期间D3D设备故障

时间:2012-01-14 02:02:48

标签: windows winapi directx device

我遇到Direct3D9 :: CreateDevice()失败导致的问题。在Windows 7下使用锁定屏幕执行以下代码时失败。由于要求,我需要能够在屏幕锁定时创建设备。

使用以下参数调用CreateDevice时出现D3DERR_INVALIDCALL错误。我已经对使用的HWND进行了广泛的实验,并仔细检查了它是否有效。我也尝试了对演示参数的各种调整无济于事。任何人之前遇到过这种情况,或者更好地了解可能导致无效呼叫返回的原因?

同样,此失败仅在锁定屏幕时发生,当在任何其他测试状态下运行时,它会成功。

D3DPRESENT_PARAMETERS pp;
ZeroMemory( &pp, sizeof(D3DPRESENT_PARAMETERS) );
pp.BackBufferFormat = D3DFMT_UNKNOWN;
pp.SwapEffect       = D3DSWAPEFFECT_DISCARD;
pp.Windowed         = TRUE;

HWND focusWndHnd = GetConsoleWindow();

if ( focusWndHnd == NULL && pp.hDeviceWindow == NULL )
{
   focusWndHnd = ::GetDesktopWindow();
}


IDirect3DDevice9* pd3dDevice;

IDirect3D9* pD3D = Direct3DCreate9( D3D_SDK_VERSION );

hr = pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, focusWndHnd,
             D3DCREATE_SOFTWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE, &pp, &pd3dDevice );

4 个答案:

答案 0 :(得分:3)

传统的Direct3D 9界面将“安全桌面”视为丢失的设备方案。使用WDDM感知版本的Direct3D(Direct3D9Ex,Direct3D 10.x或Direct3D 11.x)可以避免此问题。

答案 1 :(得分:1)

你可能需要一个与D3DFMT_UNKNOWN不同的BackBufferFormat值,因为只有窗口应用允许这个值,就像OJ所说here一样吗?

答案 2 :(得分:0)

我的记忆是模糊的,但我相信这是一个已知的限制(“设计”)D3D与锁定屏幕(并作为服务运行)。

即使您可以创建D3D设备,也无法在锁定屏幕上绘制。所以你可能会更好地设计你的应用程序,以便在屏幕解锁之后推迟创建D3D设备。

使用WTSRegisterSessionNotification注册屏幕锁定或解锁时的通知。

答案 3 :(得分:0)

感谢Chuck Walbourn的回答,我解决了我的相关问题,即一旦提升提示安全会话处于活动状态,D3D设备初始化就会失败。在我的情况下,我在安全会话期间收到D3DERR_NOTAVAILABLE错误。将IDirect3D9*替换为IDirect3D9Ex*,将Direct3DCreate9替换为Direct3DCreate9Ex,然后初始化成功完成!

此外,我必须强调,查克的答案并未直接引用肯特的答案,而只是针对相关的问题,因为 - 正如我所理解的那样 - 肯特& #39; s场景是指可以通过 CTRL + L 输入的WTS_SESSIONSTATE_LOCK会话。在肯特的案例中,我在锁定会话中没有遇到D3D初始化问题。