2009-05-29 26 views
36

मैं किसी तृतीय पक्ष पूर्णस्क्रीन विंडोज एप्लिकेशन के शीर्ष पर कुछ कस्टम ग्राफिक्स प्रदर्शित करना चाहता हूं।एक 3 डी पूर्णस्क्रीन अनुप्रयोग पर ओवरलेइंग

क्या आपने कोई स्टीम गेम खेला है? इसमें एक निष्पादन योग्य, GameOverlayUI.exe है जो आपको गेम के भीतर से स्टीम विंडो तक पहुंचने देता है। (जीयूआई तत्व कस्टम-खींचे दिखते हैं, मुझे नहीं पता कि यह एक आवश्यकता है, लेकिन वे डेस्कटॉप पर जैसे ही खेल के अंदर समान दिखते हैं।) यह गेम ग्राफिक्स में 'मंद' तक भी जाता है पृष्ठ - भूमि।

मुझे आश्चर्य है कि कोई ऐसा एप्लिकेशन लिखने के बारे में कैसे जा सकता है।

मैं यह भी सोच रहा हूं कि समाधान का दायरा कितना व्यापक होगा। क्या आप सभी ओपनजीएल अनुप्रयोगों के लिए एक विधि का उपयोग कर सकते हैं? सभी Direct3D ऋण DirectDraw अनुप्रयोगों के लिए? सभी पूर्णस्क्रीन विंडोज अनुप्रयोगों के लिए?

मैं अधिक 'आधुनिक' और जेनेरिक समाधान ढूंढ रहा हूं - कमांड प्रॉम्प्ट ओवरले करना या 320x240 अनुक्रमित रंग अनुप्रयोग चिंता का विषय नहीं है।

संपादित करें: कुछ स्पष्टीकरण: पूर्णस्क्रीन एप्लिकेशन मेरा नहीं है। यह कुछ भी हो सकता है। सबसे अधिक, यह एक 3 डी खेल होगा। मैं ग्राफिक्स के शीर्ष पर, स्क्रीन के निचले दाएं कोने में एक डिजिटल घड़ी का प्रदर्शन करना चाहता हूं। यदि संभव हो तो मैं प्रक्रिया इंजेक्शन या प्रक्रिया को डीबग करने जैसी चाल से बचना चाहूंगा।

+0

आपने उपर्युक्त दृष्टिकोण के साथ कितना दूर तक प्रबंधन किया है। मैं एक समान स्थिति में फंस गया हूं और मैं क्रोमियम एम्बेडेड वेबव्यू ओवरले के रूप में आकर्षित करना चाहता हूं। क्या आपको लगता है कि यह संभव है? – alDiablo

उत्तर

18

अच्छा, यहां एक और उदाहरण है।एक्सफायर एक चैट प्रोग्राम है जो गेम में अपने इंटरफ़ेस को ओवरले करता है ताकि आप खेलते समय संदेश प्राप्त कर सकें। जिस तरह से वे ऐसा करते हैं, प्रक्रिया मेमोरी स्तर पर d3d/opengl DLL को संपादित करके, असेंबली कूद को इंजेक्शन देना। मुझे यह पता है क्योंकि उनकी विधि मेरे मोड को दुर्घटनाग्रस्त कर रही थी, और मैंने वास्तव में अजीब असेंबली कोड देखा जो वे d3d9.dll में इंजेक्शन दे रहे थे।

  1. लक्ष्य खेल की प्रक्रिया
  2. d3d.dll के लिए अपने प्रक्रिया स्मृति खोज/opengl.dll
  3. प्रक्रिया में एक DLL कस्टम युक्त इंजेक्षन:

    तो यहाँ कैसे Xfire इस करता है इंटरफ़ेस तर्क

  4. कनेक्ट इंटरफ़ेस का मैन्युअल विधानसभा लिख ​​कर कार्यक्रम का प्रवाह करने के लिए कार्य करता है D3D/ओपन प्रक्रिया स्मृति में पाया कार्यों में कूदता

कोई अन्य कल्पनीय तरीका नहीं है क्योंकि आपको उस गेम से संबंधित ग्राफिक्स डिवाइस को हाइजैक करने की आवश्यकता है। मैं यह शर्त लगाने के लिए तैयार हूं कि स्टीम Xfire के समान ही करता है। तो हाँ, ऐसा करने का कोई आसान तरीका नहीं है जब तक कि किसी ने कम स्तर पर आपको जो कुछ भी करने की आवश्यकता है, उसे करने के लिए उपयोगी लाइब्रेरी नहीं बनाई।

आपने अपने ओवरले के तहत गेम ग्राफिक्स को कम करने के बारे में भी पूछा। स्क्रीन पर एक भरे पारदर्शी आयत खींचने के लिए यह सिर्फ एक साधारण DrawPrimitive कॉल है।

+0

उत्कृष्ट। आपके दूसरे उत्तर के साथ मिलकर, यही वह है जिसे मैं ढूंढ रहा हूं। धन्यवाद। – aib

+9

मल्टीप्लेयर गेम के साथ ऐसा करने पर सावधान रहें जैसे कि पंकबस्टर जैसे एंटी धोखा सॉफ्टवेयर की आवश्यकता है! चल रहे गेम में कस्टम लाइब्रेरी इंजेक्शन इंट्रूसिव गेम मैनिपुलेशन और धोखाधड़ी के रूप में माना जाता है। कार्यक्रम (जैसे एक्सफायर, टीम्सपीक ओवरले, ...) सफेद सूचीबद्ध हैं और धोखाधड़ी के उल्लंघन का कारण नहीं बनेंगे लेकिन यह एंटी-चीट-विक्रेता द्वारा की जाने वाली एक सीखने की प्रक्रिया है जो समय लेने वाली हो सकती है जहां आपका प्रोग्राम नहीं हो सकता प्रभावी ढंग से इस्तेमाल किया। – Robert

-1

मैंने 3 डी विज़ुअलाइज़ेशन के शीर्ष पर कुछ अच्छी 2 डी जीडीआई + सामग्री पेंट करने के लिए ओवरले का उपयोग करके डायरेक्टएक्स & डब्ल्यूपीएफ व्यूपोर्ट्स (एक ही चीज़, वास्तव में) दोनों के साथ ओवरले किया है।

मैंने "वास्तविक" विज़ुअलाइज़ेशन के शीर्ष पर एक पैनल का उपयोग करके प्रबंधित किया, जिससे बिट्स को छोड़कर मैं पारदर्शी रंग को सेट कर रहा था। बहुत अच्छी तरह से काम किया, लेकिन यह "ड्रॉइंग" परत के माध्यम से 3 डी नियंत्रण में क्लिक, ड्रैग, और अन्य घटनाओं से गुजरने वाला दर्द था।

+0

मुझे खेद है कि मेरा प्रश्न स्पष्ट नहीं था: मेरे मामले में, "वास्तविक" विज़ुअलाइज़ेशन किसी तृतीय पक्ष ऐप द्वारा खींचा जाता है। मैंने एक ही आवेदन के संदर्भ में, एक बार, जो किया है, मैंने किया है। मुझे नहीं पता कि आपका उत्तर दो अलग-अलग अनुप्रयोगों के संदर्भ में प्रासंगिक है या नहीं; अगर ऐसा है, तो मैं पूर्णस्क्रीन माता-पिता के संदर्भ में बाल पैनल बनाने के बारे में कैसे जाऊं? – aib

18

पूर्ण कोड here

यह एक बहुत गूढ़ कला है के साथ एक सार बनाया गया है, और वहाँ यह करने के लिए कई तरीके हैं। मैं डायरेक्ट 3 डी रैपर कहलाता हूं। ऐसा करने के बाद से सालों रहे हैं, लेकिन मैंने इसे एक बार खेल के साथ किया था। मैंने कुछ विवरण छोड़े होंगे, लेकिन मुझे उम्मीद है कि इस विचार को स्पष्ट करने की उम्मीद है।

सभी डायरेक्ट 3 डी 9 गेम स्क्रीन को प्रस्तुत करने के बाद IDirect3DDevice9::EndScene पर कॉल करने और तैयार होने के लिए तैयार होने की आवश्यकता है। तो सिद्धांत रूप में, हम EndScene के अंदर कस्टम कोड डाल सकते हैं जो कि हम खेल पर जो चाहते हैं उसे आकर्षित करता है। हम ऐसा क्लास बनाकर करते हैं जो गेम पर IDirect3DDevice9 जैसा दिखता है, लेकिन यह वास्तव में केवल एक रैपर है जो सभी फ़ंक्शन को वास्तविक कक्षा में कॉल करता है। तो अब, हमारे कस्टम कक्षा में, EndScene के लिए हमारे आवरण समारोह इस तरह दिखता है:

HRESULT IDirect3DDevice9::EndScene() 
{ 
    // draw overlays here 

    realDevice.EndScene(); 
} 

फिर हम एक DLL d3d9.dll कहा जाता है में यह संकलन, और खेल निष्पादन की निर्देशिका में छोड़ें। असली d3d9.dll/system32 फ़ोल्डर में होना चाहिए, लेकिन गेम पहले वर्तमान निर्देशिका में दिखता है, और इसके बजाय हमारे लोड करता है। एक बार गेम लोड होने के बाद, यह हमारे रैपर वर्ग का उदाहरण बनाने के लिए हमारे डीएलएल का उपयोग करता है। और अब प्रत्येक बार EndScene कहा जाता है, हमारा कोड उस स्क्रीन को निष्पादित करने के लिए निष्पादित किया जाता है जिसे हम स्क्रीन पर चाहते हैं।

मुझे लगता है कि आप ओपनजीएल के साथ एक ही सिद्धांत का प्रयास कर सकते हैं। लेकिन छेड़छाड़ को रोकने के लिए, मुझे लगता है कि कुछ आधुनिक गेम इसे रोकने की कोशिश करते हैं।

+0

डीएलएल रैपिंग एक अच्छी तकनीक है जिसे मैंने अतीत में किया है; डी 3 डी पॉइंटर्स के लिए धन्यवाद। हालांकि, मुझे लगता है कि स्टीम को ऐसा करने का बेहतर तरीका है। मुझे लगता है मुझे कुछ और शोध करना चाहिए। – aib

+1

क्या आप मुझे शुरुआती लोगों के लिए संसाधन की ओर इशारा कर सकते हैं? गेम मोड के लिए मेरा विचार कुछ स्थितियों में कुछ शेडर प्रभाव लागू करना है, और ऐसा करने का तरीका यह प्रतीत होता है। हालांकि, मैंने कभी भी डायरेक्टएक्स के साथ कोई प्रोग्रामिंग नहीं किया है, इसलिए मैं कहां से शुरू करना चाहता हूं, अंधेरे में हूं। –

0

मैं इस बारे में सोच रहा हूं। ओपनजीएल के लिए, मैं डब्लूजीएल के स्वैपबफर को डेटोरस के साथ हुक करता हूं, गेम के बाद अपनी सामग्री खींचता हूं और फिर खुद को बफर बदलता हूं।

2

वहां एक मुफ्त सॉफ्टवेयर प्रोजेक्ट है जिसका नाम यह taksi link text है। मुझे यकीन नहीं है कि यह एप्लिकेशन प्रक्रिया को ओवरराइड कैसे करता है क्योंकि मैं अभी तक कोड की जांच कर रहा हूं लेकिन मुझे लगता है कि यह एक अच्छी परियोजना है