2010-12-07 16 views
16

ग्रीटिंग्सडब्ल्यूपीएफ - पारदर्शिता - स्ट्रीम डेस्कटॉप सामग्री

मैं एक गेम (स्टारक्राफ्ट II) के लिए स्कोरबोर्ड बनाने की प्रक्रिया में हूं। यह स्कोरबोर्ड एक सी # कोड-पीछे के साथ एक WPF अनुप्रयोग के रूप में बनाया जा रहा है। मेरे पास पहले से ही एक संस्करण है जो WinForms में 90% के लिए काम करता है लेकिन मुझे आसानी से इसे बहुत अच्छी तरह से देखने के लिए समर्थन की कमी है जो डब्ल्यूपीएफ में उपलब्ध है।

इस एप्लिकेशन का बिंदु एक चल रहे गेम के शीर्ष पर एक प्रकार का ओवरले बनाना होगा। यह गेम फ़ल्सस्क्रीन (विंडो मोड) में है, इसलिए जब WinForms में मैंने इसे कोड किया ताकि यह हमेशा शीर्ष पर होना चाहिए। ऐसा होगा और यह कोई समस्या नहीं थी।

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

क्या किसी को इस मामले के साथ कोई अनुभव है क्योंकि यह वास्तव में मेरा सिर कर रहा है। मेरा पूरा एप्लिकेशन बेकार होगा यदि यह धाराओं पर दिखाई नहीं दे रहा है। अगर मुझे पृष्ठभूमि को पारदर्शी के बजाय रंग पर रखना है तो यूआई को पूरी तरह से दिखने के मामले में ध्वस्त कर दिया जाएगा।

मैं मूल रूप से सी # & WPF में गेम-ओवरले बनाने की कोशिश कर रहा हूं। मैंने पढ़ा है कि आप इसे विभिन्न तरीकों से भी कर सकते हैं लेकिन मुझे सी ++ के बारे में कोई जानकारी नहीं है और न ही मुझे डायरेक्टएक्स

आपके समय पढ़ने और आपकी संभावित अंतर्दृष्टि के लिए धन्यवाद।

संपादित करें: सबसे अच्छा समाधान भाप/एक्सफायर/डॉल्बी एक्सोन के समान एक ओवरले होगा।

संपादित करें 2: मुझे सभी सुझावों के साथ कोई भाग्य नहीं मिला है इसलिए मैंने मूल रूप से अपनी छवि के पारदर्शी बिट्स को पारदर्शी बनाया है और उपयोगकर्ता को यह तय करने दें कि वे किस स्ट्रीमिंग सॉफ़्टवेयर का उपयोग करेंगे, इस पर निर्भर करते हैं।

+1

आपके पास http://gamedev.stackexchange.com/ – Rachel

+0

पर बेहतर किस्मत पोस्टिंग हो सकती है धन्यवाद, मैं इसे आज़मा दूंगा! – Citroenfris

+0

"स्ट्रीम" बनाने के लिए आप किस कैप्चर सॉफ्टवेयर का उपयोग कर रहे हैं? FRAPS, Camtasia, आदि? –

उत्तर

0

बस एक विचार है, लेकिन क्या होगा यदि आप इसे केवल लगभग पारदर्शी बनाते हैं (यानी अल्फा = 0.01 या तो)? फिर यह स्ट्रीमिंग द्वारा उठाए जाने के लिए पर्याप्त "पदार्थ" है, लेकिन अभी भी दृश्य को परेशान न करने के लिए पर्याप्त अदृश्य हो सकता है।

+0

समस्या यह है कि मैं AllowTransparency = "True" सेट करता हूं, यह स्ट्रीमिंग सॉफ़्टवेयर पर प्रदर्शित नहीं होता है। अगर मैं इसे झूठी पर सेट करता हूं तो खिड़की से छवि के चारों ओर एक बदसूरत सीमा है जो विचार नहीं है = [। अगर मैं खिड़की की अस्पष्टता बदलता हूं तो समस्या यह है कि उस खिड़की में सबकुछ शायद ही दिखाई देगा। – Citroenfris

+0

क्षमा करें, तो मैं भी विचारों से बाहर हूं। – TToni

+0

धन्यवाद कोई भी कम नहीं! – Citroenfris

0

एक संभावना यह है कि अल्फा-ब्लेंडिंग पूरी तरह से GPU पर पूरी की जा रही है, स्ट्रीमिंग सॉफ़्टवेयर को ढूंढने से रोकती है। तो आप अपने डब्ल्यूपीएफ ऐप में सॉफ़्टवेयर प्रतिपादन को मजबूर करने का प्रयास कर सकते हैं। आप ऐसा कर सकते हैं की स्थापना द्वारा:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

+0

मुझे डर है कि यह या तो काम नहीं करता है :(।जैसे ही मेरी खिड़कियां मूल थीम में बदलती हैं (स्ट्रीमिंग सॉफ्टवेयर स्वचालित रूप से ऐसा करता है) यह गायब हो जाता है, अन्यथा यह स्ट्रीम पर दिखाया जाता है। – Citroenfris

1

के बाद से आप किसी भी प्रतिक्रिया नहीं मिली है अभी तक मैंने सोचा कि मैं एक अलग दृष्टिकोण सुझाव देना चाहेंगे।

एक WinForm बनाएं जिसे आपने MDIParent पर सेट किया है। फिर आप एक बच्चे विंडो के रूप में अपने आवेदन में गेम लाने के लिए Win32API-आदेश भेजते हैं, सीमाओं को हटाते हैं, इसे अधिकतम करते हैं।

IntPtr Parent = hWnd of your main form. 
IntPtr hWnd = Win32.User.FindWindow(null, "TheGame"); 
Win32.User.SetParent(hWnd, Parent); 
// Get current window style of child form 
int style = Win32.User.GetWindowLong(hWnd, Win32.User.GWL_STYLE); 
// Take current window style and remove WS_CAPTION and WS_BORDER from it 
Win32.User.SetWindowLong(hWnd, Win32.User.GWL_STYLE, (style & ~Win32.User.WS_CAPTION & ~Win32.User.WS_BORDER)); 
// Maximize within parent 
Win32.User.ShowWindow(hWnd, Win32.User.SW_SHOWMAXIMIZED); 

नोट: Win32.User क्लास संबंधित Win32 इंटरऑप कमांड के लिए केवल एक वेनिला रैपर है।

अब आप इस विंडो के शीर्ष पर GDI + 'सीधे एचडब्ल्यूएनडी में डालने या इसके शीर्ष पर कुछ डालने में सक्षम होना चाहिए।आपके पास पारदर्शिता के साथ होने वाली समस्या के लिए आपको कुछ मैन्युअल प्रतिलिपि करने की आवश्यकता हो सकती है, यह कि आप कहीं भी अपना इंटरफ़ेस प्रस्तुत करते हैं, फिर इसे पिक्सेल द्वारा पिक्सेल द्वारा किसी भी पारदर्शी पिक्सेल को छोड़कर गंतव्य विंडो पर कॉपी करें।

मुझे आशा है कि यह उपयोगी है या कम से कम कुछ विचारों को स्पार्क कर सकते हैं।

संपादित करें: इसके अलावा, आप इस दिलचस्प मिल सकता है:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

नमूना एप्लिकेशन से पहले यह प्रदर्शित होता है कि आप छवि को संशोधित करने के लिए अनुमति देता है। आप बस इसमें सरल मॉड्यूल जोड़ते हैं जो इनपुट प्राप्त करता है और आउटपुट सेट करता है। असली गेमिंग के लिए उपयोग करने के लिए बहुत धीमा तरीका है। :)

EDIT2: बस SetLayeredWindowAttributes पर आया। यह सुनिश्चित नहीं है कि यह काम करता है, लेकिन आप पारदर्शिता रंग सेट करने के लिए इस कॉल का उपयोग कर सकते हैं (विंडो ढूंढने के ऊपर मेरा कोड देखें)।

1

मुझे WPF में पारदर्शिता के साथ कुछ समस्या थी। जब आप शून्य पर पारदर्शिता सेट करते हैं, तो इसमें कुछ भी नहीं है। न्यूनतम मान पर सेट करें, फिर स्ट्रीमिंग सॉफ्टवेयर इसे चुनने में सक्षम होगा।

संबंधित मुद्दे