2012-01-14 39 views
12

मुझे Direct3D9 :: CreateDevice() में विफलता के कारण कोई समस्या है। यह विफल रहता है जब निम्न कोड को विंडोज 7 के तहत लॉक स्क्रीन के साथ निष्पादित किया जाता है। आवश्यकताओं के कारण, स्क्रीन लॉक होने पर मुझे डिवाइस बनाने में सक्षम होना चाहिए।डी 3 डी डिवाइस विफलता

मुझे D3DERR_INVALIDCALL त्रुटि मिलती है जब CreateDevice को निम्न पैरामीटर के साथ बुलाया जाता है। मैंने एचडब्ल्यूएनडी के इस्तेमाल के साथ बड़े पैमाने पर प्रयोग किया है, और दो बार जांच की है कि यह मान्य है। मैंने प्रेजेंटेशन पैरामीटर में कोई फायदा नहीं होने के लिए विभिन्न बदलावों का भी प्रयास किया है। किसी को भी इसका सामना करना पड़ा या अमान्य कॉल रिटर्न के कारण क्या हो सकता है इसका बेहतर विचार है?

फिर, यह विफलता केवल लॉक स्क्रीन के साथ होती है, जब किसी अन्य परीक्षण स्थिति में चलाया जाता है, तो यह सफल होता है।

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 के साथ एक ज्ञात सीमा ("डिजाइन द्वारा") है।

भले ही आप डी 3 डी डिवाइस बना सकें, आप लॉक स्क्रीन के शीर्ष पर आकर्षित नहीं कर पाएंगे। इसलिए आप शायद अपने ऐप को डिज़ाइन करने से बेहतर होंगे जैसे कि स्क्रीन को अनलॉक होने के बाद तक यह डी 3 डी डिवाइस निर्माण को रोक देता है।

स्क्रीन लॉक या अनलॉक होने की सूचनाओं के लिए पंजीकरण के लिए WTSRegisterSessionNotification का उपयोग करें।

+1

यह मुझे स्पष्ट नहीं है कि डिवाइस निर्माण के लिए लॉक स्क्रीन क्यों विफल होनी चाहिए, विशेष रूप से जब स्क्रीन पर कोई वास्तविक निर्भरता न हो तो NULLREF मोड में चलाएं। डायरेक्टएक्स के मेरे उपयोग में स्क्रीन पर प्रतिपादन करने के लिए कुछ भी नहीं है, इसलिए अनलॉक करने के लिए स्क्रीन की प्रतीक्षा करना दुर्भाग्य से एक विकल्प नहीं है। –

+1

विरासत डायरेक्ट 3 डी 9 इंटरफ़ेस 'सुरक्षित डेस्कटॉप' को खोए गए डिवाइस परिदृश्य के रूप में मानता है। डायरेक्ट 3 डी (डायरेक्ट 3 डी 9ईएक्स, डायरेक्ट 3 डी 10.x, या डायरेक्ट 3 डी 11.x) के डब्लूडीडीएम जागरूक संस्करण का उपयोग इस समस्या से बच जाएगा। –

+0

@ChuckWalbourn D3d9Ex मेरे लिए काम किया। यदि आप पूर्ण टिप्पणी पर अपनी टिप्पणी को बढ़ावा देते हैं तो मैं आपको उखाड़ दूंगा :) –

1

क्या यह हो सकता है कि आपको बैकबफर फ़ार्मेट के लिए D3DFMT_UNKNOWN से भिन्न भिन्नता की आवश्यकता हो, केवल उस विंडो की अनुमति देने वाले विंडो वाले ऐप्स के कारण, ओजे ने here कहा था?

+0

दुर्भाग्य से, यह एक ही त्रुटि ('D3DERR_INVALIDCALL') में परिणाम देता है। –

2

विरासत डायरेक्ट 3 डी 9 इंटरफ़ेस 'सुरक्षित डेस्कटॉप' को खोए गए डिवाइस परिदृश्य के रूप में मानता है। डायरेक्ट 3 डी (डायरेक्ट 3 डी 9ईएक्स, डायरेक्ट 3 डी 10.x, या डायरेक्ट 3 डी 11.x) के डब्लूडीडीएम जागरूक संस्करण का उपयोग इस समस्या से बच जाएगा।