2012-01-14 6 views
12

Ho un problema causato da un errore in Direct3D9 :: CreateDevice(). Non riesce quando il codice seguente viene eseguito con una schermata bloccata in Windows 7. A causa dei requisiti, devo essere in grado di creare un dispositivo mentre lo schermo è bloccato.Errore dispositivo D3D durante blocco schermo

Viene visualizzato un errore D3DERR_INVALIDCALL quando CreateDevice viene chiamato con i seguenti parametri. Ho fatto molti esperimenti con l'HWND in uso e ho verificato che fosse valido. Ho anche provato varie modifiche ai parametri di presentazione senza alcun risultato. Qualcuno lo ha già incontrato o ha un'idea migliore di ciò che potrebbe causare il ritorno della chiamata non valida?

Anche in questo caso, questo errore si verifica solo con una schermata bloccata, quando viene eseguito in qualsiasi altro stato testato, ha esito positivo.

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

risposta

0

La mia memoria è confusa, ma credo che questa è una limitazione nota ("by design"), con D3D rispetto alla schermata di blocco (e in esecuzione come servizio).

Anche se è possibile creare il dispositivo D3D, non sarà possibile disegnare sulla schermata di blocco. Quindi probabilmente starai meglio progettando la tua app in modo tale che rimuova la creazione del dispositivo D3D fino a quando lo schermo non viene sbloccato.

Utilizzare WTSRegisterSessionNotification per registrare le notifiche di quando lo schermo è bloccato o sbloccato.

+1

Non mi è chiaro perché una schermata bloccata debba fallire per la creazione del dispositivo, in particolare quando viene eseguita in modalità NULLREF senza una reale dipendenza dallo schermo. Il mio utilizzo di DirectX non ha nulla a che fare con il rendering sullo schermo, quindi attendere che lo schermo si sblocchi non è purtroppo un'opzione. –

+1

L'interfaccia legacy di Direct3D 9 considera il 'desktop sicuro' come uno scenario di dispositivo perso. L'uso di una versione WDDM di Direct3D (Direct3D9Ex, Direct3D 10.xo Direct3D 11.x) eviterà questo problema. –

+0

@ChuckWalbourn D3d9Ex ha funzionato per me. Ti invierò di nuovo se promuovi il tuo commento alla risposta completa :) –

1

Potrebbe essere necessario un valore diverso per BackBufferFormat diverso da D3DFMT_UNKNOWN, a causa delle sole app in finestra che consentono tale valore, proprio come indicato da OJ here?

+0

Sfortunatamente, ciò comporta lo stesso errore ('D3DERR_INVALIDCALL'). –

2

L'interfaccia legacy Direct3D 9 considera il "desktop sicuro" come uno scenario di dispositivo perso. L'uso di una versione WDDM di Direct3D (Direct3D9Ex, Direct3D 10.xo Direct3D 11.x) eviterà questo problema.