屏幕锁定期间D3D设备故障

Ken*_*ell 12 windows directx winapi 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 );
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 0

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

即使您可以创建 D3D 设备,您也无法在锁定屏幕顶部绘图。因此,您最好将应用程序设计为将 D3D 设备创建推迟到屏幕解锁之后。

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

  • 我不清楚为什么锁定的屏幕在设备创建时会失败,特别是在 NULLREF 模式下运行且不真正依赖屏幕时。我对 DirectX 的使用与渲染到屏幕无关,因此不幸的是,等待屏幕解锁不是一个选择。 (2认同)
  • 旧版 Direct3D 9 界面将“安全桌面”视为设备丢失的情况。使用支持 WDDM 的 Direct3D 版本(Direct3D9Ex、Direct3D 10.x 或 Direct3D 11.x)可以避免此问题。 (2认同)