2012-01-14 4 views
12

Direct3D9 :: CreateDevice() 오류로 인해 문제가 발생했습니다. Windows 7에서 잠긴 화면에서 다음 코드를 실행하면 오류가 발생합니다. 요구 사항 때문에 화면이 잠겨있는 동안 장치를 만들 수 있어야합니다.화면 잠금 동안 D3D 장치 오류가 발생했습니다.

다음 매개 변수를 사용하여 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

내 기억은 흐릿하지만, 나는이 잠금 화면에 대해 (및 서비스로 실행)와 D3D와 ("디자인에 의한") 알려진 제한 사항입니다 생각합니다.

D3D 장치를 만들 수있는 경우에도 잠금 화면 맨 위에 그릴 수 없습니다. 따라서 앱이 화면을 잠그지 않을 때까지 D3D 장치 생성을 연기하도록 앱을 설계하는 것이 더 나을 것입니다.

WTSRegisterSessionNotification을 사용하면 화면이 잠기거나 잠금 해제 될 때 알림을 등록 할 수 있습니다.

+1

특히 화면에 실제로 의존하지 않는 NULLREF 모드에서 실행될 때 잠긴 화면이 장치 생성에 실패해야하는 이유는 분명하지 않습니다. DirectX를 사용하면 화면에 렌더링하는 것과 아무런 관련이 없으므로 화면을 잠글 때까지 기다리는 것이 불행히도 옵션이 아닙니다. –

+1

레거시 Direct3D 9 인터페이스는 '보안 데스크톱'이 손실 된 장치 시나리오로 간주합니다. Direct3D (Direct3D9Ex, Direct3D 10.x 또는 Direct3D 11.x)의 WDDM 인식 버전을 사용하면이 문제를 피할 수 있습니다. –

+0

@ChuckWalbourn D3d9Ex가 나를 위해 일했습니다. 귀하의 의견을 전체 답장으로 승격 시키면 나는 당신을 업 그레 이드합니다 :) –

1

OJ가 here을 명시한 것처럼 그 값을 허용하는 창 응용 프로그램만으로 인해 D3DFMT_UNKNOWN과 다른 BackBufferFormat에 대해 다른 값이 필요합니까?

+0

불행히도, 이것은 같은 오류 ('D3DERR_INVALIDCALL')를 초래합니다. –

2

레거시 Direct3D 9 인터페이스는 '보안 데스크톱'이 손실 된 장치 시나리오로 간주합니다. Direct3D (Direct3D9Ex, Direct3D 10.x 또는 Direct3D 11.x)의 WDDM 인식 버전을 사용하면이 문제를 피할 수 있습니다.

관련 문제