2012-01-14 14 views
12

Tengo un problema causado por una falla en Direct3D9 :: CreateDevice(). Falla cuando se ejecuta el siguiente código con una pantalla bloqueada en Windows 7. Debido a los requisitos, necesito poder crear un dispositivo mientras la pantalla está bloqueada.Fallo del dispositivo D3D durante la pantalla bloqueada

Aparece un error D3DERR_INVALIDCALL cuando se invoca CreateDevice con los siguientes parámetros. He experimentado mucho con el HWND que se está utilizando y he verificado que sea válido. También probé varios ajustes a los parámetros de presentación en vano. ¿Alguien se encontró con esto antes o tiene una mejor idea de lo que podría estar causando el retorno de la llamada no válida?

Nuevamente, esta falla solo ocurre con una pantalla bloqueada, cuando se ejecuta en cualquier otro estado probado, tiene éxito.

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); 

Respuesta

0

Mi memoria es vaga, pero creo que esto es una limitación conocida ("por diseño") con D3D con respecto a la pantalla de bloqueo (y se ejecuta como un servicio).

Incluso si pudiera crear el dispositivo D3D, no podrá dibujar en la parte superior de la pantalla de bloqueo. Por lo tanto, probablemente será mejor que diseñe su aplicación de modo que difiera la creación del dispositivo D3D hasta que la pantalla se desbloquee.

Utilice WTSRegisterSessionNotification para registrarse y ver si la pantalla se bloquea o se desbloquea.

+1

No tengo claro por qué una pantalla bloqueada debería fallar para la creación del dispositivo, particularmente cuando se ejecuta en modo NULLREF sin dependencia real de la pantalla. Mi uso de DirectX no tiene nada que ver con la representación en la pantalla, por lo tanto, desafortunadamente no es una opción esperar a que se desbloquee la pantalla. –

+1

La interfaz heredada de Direct3D 9 considera que el 'escritorio seguro' es un escenario de dispositivo perdido. El uso de una versión compatible con WDDM de Direct3D (Direct3D9Ex, Direct3D 10.x o Direct3D 11.x) evitará este problema. –

+0

@ChuckWalbourn D3d9Ex funcionó para mí. Te recomiendo si promocionas tu comentario a la respuesta completa :) –

1

¿Podría ser que necesite un valor diferente para BackBufferFormat diferente de D3DFMT_UNKNOWN, debido a que solo las aplicaciones con ventana permiten ese valor, al igual que OJ declaró here?

+0

Desafortunadamente, esto produce el mismo error ('D3DERR_INVALIDCALL'). –

2

La interfaz heredada Direct3D 9 considera que el 'escritorio seguro' es un escenario de dispositivo perdido. El uso de una versión compatible con WDDM de Direct3D (Direct3D9Ex, Direct3D 10.x o Direct3D 11.x) evitará este problema.

Cuestiones relacionadas