我遇到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 );
答案 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初始化问题。