2010-04-12 23 views
17

मैं डायरेक्टएक्स का उपयोग कर विंडोज 7 के लिए एक एनिमेटेड डेस्कटॉप पृष्ठभूमि बनाना चाहता हूं। मैं सी #, स्लिम डीएक्स और कुछ पी/विंडोज एपीआई कार्यों के आयात को आयात कर रहा हूं। मैं देशी विंडोज प्रोग्रामिंग के साथ शानदार नहीं हूं, लेकिन मुझे विश्वास है कि मुझे ऑनलाइन क्या करना है और मुझे विश्वास है कि मुझे क्या करना है या तो:डायरेक्टएक्स डेस्कटॉप

1) डेकस्टॉप वॉलपेपर वाली विंडो के हैंडल को ढूंढें, इसे हुक करें एक डायरेक्टएक्स डिवाइस पर और इसमें आकर्षित करें।

2) एक नई आउटपुट विंडो बनाएं, और डेस्कटॉप वॉलपेपर के ऊपर डालें और डेस्कटॉप आइकन के नीचे डालें।

मैंने इन दोनों की कोशिश की है, लेकिन न ही काम करने लगता है। अगर मैं GetDesktopWindow() द्वारा दिए गए हैंडल से शुरू होने वाली विंडो विरासत को नेविगेट करता हूं, तो मैं डेस्कटॉप -> वर्कर डब्ल्यू -> SHELLDLL_DefView -> SysListView32 पर जा सकता हूं। अगर मैं इस हैंडल में डायरेक्टएक्स डिवाइस को हुक करता हूं, तो मैं पूरे डेस्कटॉप पर आकर्षित कर सकता हूं, लेकिन इसमें आइकन भी शामिल हैं। यदि मैं एक विंडोज फॉर्म बनाता हूं, तो अपने माता-पिता को SetParent() का उपयोग करके SHELLDLL_DefView पर सेट करें और फिर अपने Z-order के साथ खेलने के लिए SetWindowPos का उपयोग करें, मुझे लगता है कि यह डेस्कटॉप वॉलपेपर के पीछे या डेस्कटॉप + आइकन के सामने जा सकता है।

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

क्या किसी के पास कोई विचार है कि मुझे क्या करना चाहिए, या यहां तक ​​कि मैं क्या करना चाहता हूं? यह आप GDI का उपयोग कर डेस्कटॉप पृष्ठभूमि के लिए आकर्षित कर सकते हैं (जैसा कि मेरा मानना ​​है कि wxSnow कार्यक्रम करता है) लगता है, और मुझे लगता है कि मैं क्या इसके DirectX वॉलपेपर मोड के साथ Windows XP के तहत वीएलसी मीडिया प्लेयर के द्वारा किया जाता करना चाहते हैं (दिलचस्प बात करने के लिए कुछ इसी तरह देखा है, मैं ऐसा लगता है कि यह विकल्प मेरे सिस्टम पर सक्षम नहीं है)।

धन्यवाद!

+0

वाह, मुझे यह भी एहसास नहीं हुआ कि ड्रीमसेन को 7 से हटा दिया गया था। मुझे Vista की सुविधा पसंद आई! यहां एक ब्लॉग पोस्ट है कि इसे वापस कैसे प्राप्त करें http://www.mydigitallife.info/2009/01/14/how-to-install-and-enable-dreamscene-in-windows-7/ (यह, ज़ाहिर है, आपको ऐसा करने के लिए प्रोग्राम लिखने की आवश्यकता के बिना अपने डेस्कटॉप को एनिमेट करने की अनुमति देता है, जो इस सवाल को पढ़ते हैं कि वे अपने डेस्कटॉप को एनिमेट करने की उम्मीद करते हैं और इसे करने के लिए प्रोग्राम लिखने की आवश्यकता नहीं है)। – Ricket

+1

आप सी ++ में अपना विकास करने से बेहतर होंगे, क्योंकि मेरा मानना ​​है कि डायरेक्टएक्स 9 एक प्रबंधित डायरेक्टएक्स एपीआई के साथ अंतिम संस्करण था। –

+1

स्लिम डीएक्स (http://slimdx.org/) डायरेक्टएक्स के लिए एक रैपर है, जो एमडीएक्स के विपरीत, डायरेक्टएक्स के नवीनतम संस्करणों का समर्थन करने के लिए नियमित रूप से अपडेट किया जाता है। आप सही हैं, शायद मुझे सी ++ में विकसित होना चाहिए, लेकिन मुझे इसके लिए सी # बहुत पसंद है। – Jonathan

उत्तर

1

मुझे लगता है कि आप गतिशील रूप से बिटमैप पैदा करने और लगातार डेस्कटॉप पृष्ठभूमि के रूप में इन की स्थापना द्वारा प्रति सेकंड काफी कुछ फ्रेम मिल सकता है। हालांकि, यह सीपीयू के लिए अनावश्यक रूप से (लगभग बेवकूफ) भारी लगता है। अद्यतन: अब मैं इसके बारे में लगता है कि (जब मैं यह लिखा यह देर हो चुकी थी), इस तरह के एक दृष्टिकोण के साथ मुख्य समस्या यह है कि आप लिख सकते हैं और हर बार एक नया फ्रेम प्रदर्शित करने के लिए है हार्ड ड्राइव से बिटमैप्स पढ़ने की जरूरत है। यह व्यवहार्य नहीं है।

तुम सच में माउस के लिए डेस्कटॉप का उपयोग कर रहे हैं? विंडोज 7 में स्टार्ट मेनू सर्च फ़ंक्शन और नई टास्कबार ने मुझे आइकन के लिए डेस्कटॉप का उपयोग नहीं किया है।

बस एक विचार

यह ,, डेस्कटॉप खिड़की को बदलने के लिए SendMessage (GetDesktopWindow, WM_SOME_MESSAGE, wParam, lParam) के माध्यम से इतना है कि आप प्राप्त कर सकते हैं कि आप क्या चाहते संभव हो सकता है। मैं कल और इसकी जांच कर सकता हूं (वर्तमान में 3 बजे, स्थानीय समय)।

+0

धन्यवाद। जैसा कि आप कहते हैं, मुझे लगता है कि जीडीआई का उपयोग करना या एपीआई कार्यों के साथ वॉलपेपर सेट करना शायद सीपीयू को मार देगा, दुर्भाग्य से मुख्य कारण है कि मैं ड्रीमसेन की बजाय डायरेक्टएक्स का उपयोग करना चाहता हूं। मुझे लगता है कि मैंने SendMessage() का उपयोग करने के लिए कुछ संदर्भ देखे हैं जो मैं चाहता हूं, लेकिन फिलहाल विंडोज एपीआई का यह हिस्सा मेरे बाहर थोड़ा सा है। अगर यह आशाजनक लग रहा है, तो मैं इसे पढ़ूंगा। अन्यथा, मैं आपकी सलाह लेता हूं और यादृच्छिक जंक के लिए स्टोर के रूप में अपने डेस्कटॉप का उपयोग बंद कर देता हूं। – Jonathan

5

ऐसा लगता है कि यह संभव नहीं हो सकता है।इस लिंक देखें:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/69839cec-3424-4300-9ac3-486b8c2fe492

आप डेस्कटॉप पृष्ठभूमि और डेस्कटॉप चिह्न, एक वैकल्पिक कदम नीचे है के बीच कुछ नियंत्रण आकर्षित करने के लिए की जरूरत है:

  1. में अपना उपयोगकर्ता नियंत्रण बनाएं एक विंडोज नियंत्रण पुस्तकालय।
  2. एक ActiveX नियंत्रण में उपयोगकर्ता नियंत्रण एम्बेड करें।
  3. किसी वेब पेज में ActiveX नियंत्रण एम्बेड करें।
  4. सक्रिय डेस्कटॉप सक्षम करें और वेब पेज को अपना डेस्कटॉप पृष्ठभूमि सेट करें।

यह केवल XP में किया जा सकता है क्योंकि Vista सक्रिय डेस्कटॉप का समर्थन नहीं करता है।

एक और पोस्ट वहाँ पता चलता है कि आप संभवतः एक अन्वेषक विंडो के पृष्ठभूमि के साथ ऐसा कर सकता है - अगर आप खिड़की है कि यह गठन के हत्थे मिल सकता है। बेशक, यदि यह संभव है तो आइकन के पीछे डेस्कटॉप विंडो के हैंडल को प्राप्त करना भी संभव हो सकता है।

अद्यतन: ठीक है, अब तक केवल एक चीज जो मैंने पाया है कि संभवतः "काम" हो सकता है, बस बिटमैप फाइलें बना रहा है और वॉलपेपर को बार-बार बदल रहा है (मुझे संदेह है कि यह धीमा होगा, जैसा कि आपने बताया है) ।

वह पूर्ण स्क्रीन छवि कहीं स्मृति में निवासी होना चाहिए, लेकिन बिना किसी गंभीर निम्न-स्तरीय मेमोरी हैकिंग के इसे एक्सेस करने का कोई तरीका नहीं हो सकता है। मैं देख रहा हूँ।

अद्यतन 2: यह काम हो सकता है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ:

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/4af734fb-d2c1-414b-a9f1-759b76692802

इसके बारे में मांस यह है:

HWND p = FindWindow("ProgMan", NULL); 
HWND s = FindWindowEx(p, NULL, "SHELLDLL_DefView", NULL); 
HWND dtw = FindWindowEx(s, NULL, "SysListView32", NULL); 
HDC hdc = GetDC(dtw); 

आप मूल रूप से साथ शुरू कर रहे हैं प्रोगमैन विंडो और डेस्कटॉप वॉलपेपर से वहां ड्रिलिंग ("SysListView32", मुझे लगता है)। मैं इसे आजमाने की कोशिश कर रहा हूं।

अपडेट 3: कोई नहीं - उपर्युक्त कोड डेस्कटॉप की डीसी प्राप्त करता है, लेकिन यह आइकन के ऊपर है इसलिए बिटबल्ट उन पर आकर्षित करता है। यह स्क्रीन पर नहीं आ रहा है, हालांकि, क्योंकि मैं इसे बिना कवर किए एक खुले रूप के नीचे खींच सकता हूं, इसलिए कम से कम प्रगति हो रही है।

मुझे लगता है कि "SysListView32" के अलावा कुछ विंडो उपलब्ध है जो आइकन के पीछे डेस्कटॉप है, या एक से अधिक "SysListView32" विंडो है।

अद्यतन 4:

http://msdn.microsoft.com/en-us/library/bb761155(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/bb774742(v=VS.85).aspx

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

क्या डायरेक्टएक्स फ्रेम को बिटमैप हैंडल (जीडीआई-संगत) के रूप में उजागर करता है, या क्या यह केवल डीसी का पर्दाफाश करता है? मेरे मामले में, मेरी एनीमेशन पहले ही जीडीआई-संगत बिटमैप्स की एक सरणी है, इसलिए मुझे इस दृष्टिकोण का उपयोग करने में कोई परेशानी नहीं होगी। यदि यह एकमात्र मार्ग है, और डायरेक्टएक्स बिटमैप हैंडल का खुलासा नहीं करता है (और मुझे नहीं लगता कि वे चाहते हैं), तो प्रत्येक फ्रेम के लिए आपको एक नया जीडीआई बिटमैप बनाना होगा, जो चीजों को धीमा कर देगा।

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

आप यहां कुछ काम कैसे करते हैं? :)

+0

लिंक के लिए धन्यवाद। जैसा कि मैंने पिछली पोस्ट के जवाब में उल्लेख किया है, एनीमेशन के लिए जीडीआई का उपयोग करके बहुत सी CPU पावर लगती है। WxSnow डेस्कटॉप पर स्नोफ्लेक्स के बिटमैप्स को पेंट करने के लिए फोरम पर सुझाव के लिए एक समान विधि का उपयोग करता है, और साथ ही साथ 20% सीपीयू खाने के लिए, यह डेस्कटॉप विंडो मैनेजर और विंडोज एक्सप्लोरर पागल ड्राइव करता है और उन्हें सर्वश्रेष्ठ लेने का कारण बनता है अन्य 80% का हिस्सा। – Jonathan

+1

जीडीआई (बिटब्लैट इत्यादि) में कोई अंतर्निहित प्रदर्शन समस्या नहीं है। मैं इसे फास्ट, फुलस्क्रीन एनीमेशन (> 30 एफपीएस) के लिए उपयोग करता हूं, जो संबंधित डायरेक्टएक्स/डायरेक्टशो दृष्टिकोण से सीपीयू का बहुत कम लेता है। वास्तव में, जीडीआई के साथ एनीमेशन की प्राथमिक सीमा यह है कि "फाड़ने" प्रभाव से निपटने का कोई तरीका नहीं है, क्योंकि जीडीआई को आपके मॉनिटर की स्कैन लाइन की सभी स्थिति में कोई जागरूकता नहीं है। ऐसा करने के लिए डायरेक्टएक्स की अर्ध-विश्वसनीय विधि है, हालांकि यह अभी भी फाड़ने से रोकने के लिए इसका उपयोग करने का दर्द है। – MusiGenesis

+0

हां, मैं एनिमेशन के लिए जीडीआई का उपयोग करता हूं (> 30 एफपीएस) भी। लेकिन केवल साधारण 2 डी एनिमेशन के लिए। यदि आप 3 डी के साथ काम कर रहे हैं, तो आपको GPU का उपयोग करने की आवश्यकता है।लेकिन ध्यान दें कि डायरेक्टएक्स की बजाय जीडीआई का उपयोग समस्या को हल नहीं करेगा। जब आप GetDC (GetDesktopWindow) से प्राप्त डीसी को लिखते हैं, तो आप डेस्कटॉप पर आइकन ओवरराइट कर देंगे। –

1

मैंने some animation of alpha blended windows किया है जो हमेशा जेड-ऑर्डर के शीर्ष पर हैं। एक विचार डेस्कटॉप बिटमैप को संशोधित करने की कोशिश करना अनदेखा करना होगा और अपनी सामग्री को layered window के रूप में खींचें, लेकिन किसी भी तरह से ZOrder का प्रबंधन करें, इसलिए यह हमेशा नीचे की सबसे अधिक, गैर-डेस्कटॉप विंडो (शायद रणनीतिक रूप से Form.SendToBack() या सही समय पर कुछ कहकर)।

आप जो करने की कोशिश कर रहे हैं उसके आधार पर आप डेस्कटॉप को एनिमेट करने का एक ही प्रभाव दे सकते हैं।

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