मैंने स्लिम डीएक्स का उपयोग कर सी # में डायरेक्ट 3 डी 9 आधारित प्रतिपादन इंजन लिखा है। एक नई परियोजना में अब मुझे एक webservice का उपयोग कर लोड 3 डी दृश्य की तस्वीरें वितरित करने की आवश्यकता है। समस्या यह है कि कुछ भी प्रस्तुत करने के लिए मुझे डायरेक्ट 3 डी डिवाइस की आवश्यकता है। क्या किसी उपयोगकर्ता को सिस्टम में लॉग इन किए बिना डायरेक्ट 3 डी डिवाइस बनाने और डेस्कटॉप लॉक नहीं होने का कोई तरीका है?लॉक सिस्टम पर 3 डी दृश्य प्रस्तुत करें
यदि यह संभव नहीं है, तो क्या किसी को कामकाज के बारे में पता है? अंत में मुझे या तो एक निष्पादन योग्य की आवश्यकता है जिसे कुछ स्थानीय उपयोगकर्ता खाते या सेवा का उपयोग करके कार्य योजनाकार से चलाया जा सकता है, जो समय-समय पर कुछ दृष्टिकोणों से दृश्य की तस्वीरें प्रस्तुत करता है।
इंजन को दो हिस्सों में विभाजित किया गया है: इंजन स्वयं और प्रस्तुतकर्ता। तो अगर कोई दूसरा रास्ता नहीं है तो मैं ओपनजीएल या किसी अन्य तकनीक का उपयोग करके एक नया रेंडरर भी कार्यान्वित कर सकता हूं जो दृश्यमान फॉर्म के बिना प्रतिपादन की अनुमति देता है।
संपादित करें:
यह क्या मैं अब तक है:
protected override void OnContinue() {
base.OnContinue();
NativeFunctions.SafeWindowStationHandle hwinsta = NativeFunctions.WindowStation.OpenWindowStation(
"WinSta0",
true,
NativeFunctions.AccessMask.WINSTA_ALL_ACCESS);
if(hwinsta == null || hwinsta.IsClosed || hwinsta.IsInvalid)
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
if(NativeFunctions.WindowStation.SetProcessWindowStation(hwinsta.DangerousGetHandle())) {
NativeFunctions.SafeDesktopHandle ptrDesktop = NativeFunctions.WindowStation.OpenInputDesktop(
0,
true,
NativeFunctions.AccessMask.DESKTOP_CREATEWINDOW);
if(ptrDesktop.IsClosed || ptrDesktop.IsInvalid)
return;
if(!NativeFunctions.WindowStation.SetThreadDesktop(ptrDesktop.DangerousGetHandle()))
return;
Log log = Logger.Instance.CreateLog("DXService", true, true, false);
log.LogMessage("Desktop set, creating D3D-Object.", LOGMESSAGELEVEL.CRITICAL, true);
Direct3D direct3D = new Direct3D();
log.LogMessage("Direct3D object created, creating device.", LOGMESSAGELEVEL.CRITICAL, true);
if(direct3D.AdapterCount == 0) {
log.LogMessage("FATAL: direct3D.AdapterCount == 0");
}
}
}
यह एक न्यूनतम WindowsService का हिस्सा है। मैंने महत्वपूर्ण कोड ऑनकॉन्टीन्यू फ़ंक्शन में डाल दिया क्योंकि स्टार्टअप कोड से डीबग करना आसान है। मैंने इस सेवाओं को सक्रिय डेस्कटॉप से बातचीत करने का अधिकार दिया है। जब मैं एक स्थानीय सिस्टम अकाउंट के रूप में सेवा चलाता हूं जो डेस्कटॉप और विंडोस्टेशन काम करता है लेकिन ग्राफिक्स एडाप्टर की संख्या अभी भी 0 है, जब मैं एक समर्पित उपयोगकर्ता खाते का उपयोग कर सेवा चलाता हूं तो मैं विंडोस्टेशन भी नहीं खोल सकता। क्या कोई और चीज है जिसे मैं कोशिश कर सकता हूं या मैं गलत कर रहा हूं? मैं विंडोज 7 मशीन पर इसका परीक्षण कर रहा हूं, जबकि मैं लॉग इन हूं क्योंकि डिबगिंग अन्यथा बहुत मुश्किल हो जाती है। क्या यह एक समस्या हो सकती है?
धन्यवाद
विंडो स्टेशनों के संकेत के लिए बहुत बहुत धन्यवाद, क्या आप इस काम को करने के लिए कुछ क्रियाओं को याद रखने की कोशिश कर सकते हैं, क्योंकि यह लगभग वही है जो मुझे चाहिए। जो मैंने अभी तक पढ़ा है, उससे मुझे अपने ऐप को एक सेवा के रूप में चलाने की जरूरत है, इंटरैक्टिव डेस्कटॉप (सुरक्षा छेद) तक पहुंचने के लिए विशेषाधिकारों के साथ और फिर किसी भी तरह से मुझे एक वैध डिवाइस बनाने में सक्षम होना चाहिए। पर कैसे? ;) – Gooo
क्षमा करें, यह बहुत समय पहले था और मैं वास्तव में उस कोड के साथ शामिल नहीं था।यह डेस्कटॉप स्क्रीन के लिए डेस्कटॉप एचडब्ल्यूएन प्राप्त करने के लिए आसान हो सकता है जो लॉगिन स्क्रीन (EnumDesktopWindows के माध्यम से) प्रदर्शित करने के लिए प्रयुक्त होता है या यह अधिक जटिल हो सकता है, मैं वास्तव में याद नहीं कर सकता। – timday