2012-01-14 14 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と同じように、その値を許可するウィンドウアプリケーションのみであるため、BackBufferFormatにD3DFMT_UNKNOWNとは異なる値を設定する必要がありますか?

+0

残念ながら、これは同じエラー( 'D3DERR_INVALIDCALL')をもたらします。 –

2

従来のDirect3D 9インターフェイスでは、「安全なデスクトップ」が紛失したデバイスのシナリオとみなされます。 Direct3D(Direct3D9Ex、Direct3D 10.x、またはDirect3D 11.x)のWDDM対応バージョンを使用すると、この問題は回避されます。

関連する問題