Подтвердить что ты не робот

Ошибка устройства D3D во время блокировки экрана

У меня проблема, вызванная сбоем в Direct3D9:: CreateDevice(). Это не удается, когда следующий код выполняется с заблокированным экраном под Windows 7. Из-за требований мне нужно иметь возможность создать устройство, когда экран заблокирован.

Я получаю ошибку D3DERR_INVALIDCALL при вызове CreateDevice со следующими параметрами. Я много экспериментировал с используемым 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 );
4b9b3361

Ответ 1

Унаследованный интерфейс Direct3D 9 считает, что "безопасный рабочий стол" является сценарием потерянного устройства. Использование WDDM-версии Direct3D (Direct3D9Ex, Direct3D 10.x или Direct3D 11.x) позволит избежать этой проблемы.

Ответ 2

Может быть, вам нужно другое значение для BackBufferFormat, отличное от D3DFMT_UNKNOWN, из-за только оконных приложений, позволяющих это значение, так же, как OJ заявил здесь?

Ответ 3

Моя память туманна, но я считаю, что это известное ограничение ( "по дизайну" ) с D3D относительно экрана блокировки (и работает как служба).

Даже если вы можете создать устройство D3D, вы не сможете нарисовать поверх экрана блокировки. Таким образом, вам, вероятно, будет лучше разрабатывать ваше приложение таким образом, чтобы оно отменяло создание устройства D3D до тех пор, пока экран не разблокируется.

Используйте WTSRegisterSessionNotification для регистрации на уведомления о том, когда экран заблокирован или разблокирован.