Отказ устройства D3D во время блокировки экрана - PullRequest
12 голосов
/ 14 января 2012

У меня проблема из-за сбоя в 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 );

Ответы [ 4 ]

3 голосов
/ 01 октября 2014

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

1 голос
/ 19 сентября 2014

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

0 голосов
/ 11 мая 2018

Благодаря ответу Чака Уолборна я решил мою связанную проблему, состоящую в том, что инициализация устройства D3D завершается неудачно, как только активируется безопасный сеанс с запросом на повышение прав. В моем случае я получил ошибку D3DERR_NOTAVAILABLE во время безопасного сеанса. Заменив IDirect3D9* на IDirect3D9Ex* и Direct3DCreate9 на Direct3DCreate9Ex, инициализация успешно завершена!

Кроме того, я должен подчеркнуть, что ответ Чака относится не к ответу Кента напрямую, а только к связанной проблеме, поскольку - насколько я понял правильно - сценарий Кента относится к WTS_SESSIONSTATE_LOCK сеанс, который можно ввести через CTRL + L . В случае с Кентом у меня не было проблем с инициализацией D3D в заблокированном сеансе.

0 голосов
/ 14 января 2012

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

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

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

...