2009-11-03 13 views
12

विंडोज एपीआई एक API GetDesktopWindow() जो रिटर्न खिड़की संभालमैं डेस्कटॉप के विंडो हैंडल कैसे प्राप्त करूं?

प्रदान करता है लेकिन मैं जासूस के साथ ++ परीक्षण किया है और मुझे लगता है कि डेस्कटॉप और "विंडोज डेस्कटॉप" की खिड़की संभाल की खिड़की संभाल ही नहीं है।

"विंडोज डेस्कटॉप" के रूप में सूची दृश्य है, मैं निम्नलिखित

1) HANDLE hWnd = GetDesktopWindow() ; 
2) FindWindow(hWnd, .....) with the SyslistView32 as the Window class. 

एक बार मैं खिड़की संभाल पाने के लिए, मैं हो रही चयनित फ़ाइल नाम की तरह संचालन के लिए) SendMessage (उपयोग करना चाहते हैं क्या करना होगा , चयनित फाइलों की संख्या, आदि

कृपया अपनी राय दें। मैं विंडोज एसडीके

+0

हो सकता है कि आप इसे संभालने के बाद आप हैंडल के साथ क्या करना चाहते हैं, इस बारे में अधिक जानकारी के साथ प्रश्न को संपादित कर सकते हैं? –

+0

ध्यान दें कि XP ​​/ Vista/7 डेस्कटॉप पर ऑब्जेक्ट्स फ़ाइलें नहीं हैं। उदाहरण के लिए, "माई कंप्यूटर" और "रीसायकल बिन" पाए जाने वाले सामान्य ऑब्जेक्ट्स हैं। वे अपने पीआईडीएल द्वारा जाना जाता है। एक पीआईडीएल एक फ़ाइल नाम का एक सामान्यीकरण है। इसलिए आप चयनित पीआईडीएल में रुचि रखते हैं। – MSalters

+0

इसलिए यदि मैं एक दस्तावेज़ की प्रतिलिपि बनाता हूं जैसे "Question.doc" (एक शब्द दस्तावेज़) क्या मुझे इसके लिए पीआईडीएल प्राप्त करने की आवश्यकता है, या क्या मैं इसे फ़ाइल के रूप में प्राप्त करता हूं। –

उत्तर

7

का उपयोग कर ऐसा कर रहा हूं यदि आप डेस्कटॉप विंडो को GetDesktopWindow() में परिभाषित करना चाहते हैं, तो उस विंडो हैंडल का उपयोग करें। यह विंडो हैंडल है जिसे आपको शीर्ष-स्तरीय विंडो और अन्य संबंधित गतिविधियों को देखने के लिए उपयोग करना चाहिए।

आप Spy ++ में जो देख रहे हैं वह केवल आपके सत्र में डेस्कटॉप के रूप में खींची गई सामग्री है। यदि आप Spy ++ में ऑटो-पता का उपयोग करते हैं, तो आप देखेंगे कि SysListView32-घोषित विंडो आपके एक्सप्लोरर शैल की एक बाल विंडो है। इस खिड़की तक पहुंच की आवश्यकता के लिए यह काफी कम है। साथ ही, इस विंडो का अस्तित्व विंडोज़ के संस्करणों के बीच परिवर्तनों के अधीन हो सकता है।

संपादित करें (अतिरिक्त जानकारी)

आप बातचीत करने के लिए या वास्तविक खोल डेस्कटॉप पर जगह बातें, तो आप बेहतर अन्य API द्वारा कार्य किया जा सकता है देख रहे हैं। यहां दो ऐसे एपीआई हैं जो विंडोज़ के लक्षित संस्करण के आधार पर इसे पूरा कर सकते हैं।

Windows Sidebar @ MSDN
यह है, हालांकि अक्सर उपयोगकर्ताओं और sysadmins रूप से अक्षम विस्टा और विंडोज 7

Using the Active Desktop @ MSDN
यह विंडोज 2000 और XP पर उपलब्ध है पर उपलब्ध है।

+1

लेकिन जासूस ++ विंडो के हैंडल को भी लौटाता है, और स्पाइ ++ द्वारा रीट्यून किए गए हैंडल और GetDesktopWindow अलग-अलग –

15

एक recent discussion on Meta के प्रकाश में शिकायत की कि इस तरह सवाल "ठीक से उत्तर नहीं" है, मैं कोशिश करते हैं और जवाब देने के इस एक एक बार आज़माएंगे लिए जा रहा हूँ। यह इंगित नहीं करना कि मुझे लगता है कि meklarian's answer वास्तव में, इससे भी बुरा है। लेकिन यह स्पष्ट रूप से असंतोषजनक समझा गया है, इसलिए शायद मैं कुछ अतिरिक्त विवरण भर सकता हूं।

आपकी समस्या वास्तव में डेस्कटॉप विंडो के बारे में काफी व्यापक भ्रम से परिणाम देती है। GetDesktopWindow functionठीक जो इसे करने के लिए प्रलेखित किया गया है: यह डेस्कटॉप विंडो में एक हैंडल देता है। हालांकि, यह वही विंडो नहीं है जिसमें डेस्कटॉप आइकन शामिल हैं। यह एक पूरी तरह से अलग खिड़की है जो विंडोज 95 में पहली बार दिखाई दी। यह वास्तव में ListView नियंत्रण "बड़े आइकन" दृश्य पर सेट है, वास्तविक डेस्कटॉप विंडो के माता-पिता के रूप में।

रेमंड चेन, विंडोज शेल टीम पर एक डेवलपर निम्न विंडोज गोपनीय लेख में कुछ अतिरिक्त विस्तार प्रदान करता है: Leftovers from Windows 3.0

[। । ।]   विंडोज 3.0 में, डेस्कटॉप पर आइकन विंडोज 95 में कम से कम विंडोज़ का प्रतिनिधित्व करते थे, डेस्कटॉप ने आइकन कंटेनर के रूप में काम किया था।

विंडोज 95 डेस्कटॉप वास्तव में एक्सप्लोरर द्वारा बनाई गई एक विंडो थी जो आपकी स्क्रीन को कवर करती थी (लेकिन आपके डेस्कटॉप पर अन्य सभी विंडोज़ के नीचे बैठी थी)। वह खिड़की थी जो आपके आइकनों को प्रदर्शित करती थी। उसमें एक खिड़की प्रबंधक डेस्कटॉप विंडो अभी भी थी (यदि आप GetDesktopWindow को कॉल करते हैं तो विंडो आपको मिलती है), लेकिन आपने इसे कभी नहीं देखा क्योंकि यह विंडोज 95 डेस्कटॉप द्वारा कवर किया गया था-वैसे ही मेरे सहयोगी के घर के तहखाने में लकड़ी पैनलिंग दीवार के पीछे मूल दीवार और समय कैप्सूल कवर किया।

[। । ।]

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

सारांश में, तो, खिड़की GetDesktopWindow समारोह से वापस लौटे वास्तविक डेस्कटॉप खिड़की, केवल एक ही हम जिस तरह से Windows 3.0 में वापस आ गया था। एक्सप्लोरर डेस्कटॉप (जिसमें आपके सभी आइकॉन हैं) डेस्कटॉप विंडो के शीर्ष पर बैठे एक और विंडो है (हालांकि वह जो पूरी तरह से मूल को कवर करता है) जिसे विंडोज 95 तक जोड़ा नहीं गया था।

यदि आप प्राप्त करना चाहते हैं एक्सप्लोरर डेस्कटॉप विंडो के लिए एक हैंडल, आपको GetDesktopWindow फ़ंक्शन को कॉल करने से परे कुछ अतिरिक्त कार्य करने की आवश्यकता है। विशेष रूप से, आपको एक्सप्लोरर आइकन प्रदर्शित करने के लिए उपयोग किए जाने वाले एक को खोजने के लिए वास्तविक डेस्कटॉप विंडो की बाल विंडो को पार करने की आवश्यकता है। प्रत्येक विंडो को पदानुक्रम में प्राप्त करने के लिए FindWindowEx function पर कॉल करके ऐसा करें जब तक आप इच्छित व्यक्ति तक नहीं पहुंच जाते। इसमें SysListView32 का वर्ग नाम है। आप शायद GetShellWindow function का उपयोग करना चाहेंगे, जो आपको प्रारंभ करने में सहायता के लिए शैल की डेस्कटॉप विंडो में एक हैंडल देता है।

कोड इस प्रकार दिखाई देंगे (चेतावनी: इस कोड अपरीक्षित है, और मैं वैसे भी इसे प्रयोग की अनुशंसा नहीं करते):

HWND hShellWnd = GetShellWindow(); 
HWND hDefView = FindWindowEx(hShellWnd, NULL, _T("SHELLDLL_DefView"), NULL); 
HWND folderView = FindWindowEx(hDefView, NULL, _T("SysListView32"), NULL); 
return folderView; 

मैं ने बताया कि कि मैं वास्तव में सलाह नहीं देते उस कोड का उपयोग कर। क्यों नहीं? क्योंकि लगभग हर मामले में आप डेस्कटॉप विंडो (या तो वास्तविक डेस्कटॉप विंडो, या एक्सप्लोरर डेस्कटॉप) पर हैंडल प्राप्त करना चाहते हैं, आप कुछ गलत कर रहे हैं।

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

ही रेमंड चेन ने अपने ब्लॉग पर एक अन्य लेख एक बहुत ही विशेष मामले का विवरण है कि, What's so special about the desktop window?

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

यदि ऐसा कोई फ़ंक्शन मौजूद नहीं है, तो सीखने के लिए सबक यह नहीं है कि माइक्रोसॉफ्ट बस डेवलपर्स के लिए जीवन कठिन बनाना चाहता है। लेकिन इसके बजाय आप को पहले स्थान पर नहीं कर रहे हैं।

+0

टिप्पणी और लिंक के लिए धन्यवाद है। यूआई स्वचालन के साथ इसका कोई लेना-देना नहीं है। मैं इस कथन से अलग होना चाहता हूं कि "आपको पहले स्थान पर ऐसा नहीं करना चाहिए" - वास्तव में विंडोज़ और कभी-कभी COM नलसाजी के माध्यम से पुनरावृत्ति करना, विंडोज़ तक पहुंचने का ** केवल ** तरीका है। –

+0

@ सुजय: वह टिप्पणी पूरी तरह से बिंदु को याद करती है। इन खिड़कियों को पाने के लिए आपको * माना * नहीं है। मैंने इसे अन्य लोगों से खिलौने चुरा लेने की तुलना की जब उन्होंने आपको उनके साथ खेलने की अनुमति नहीं दी। COM के साथ इसका कोई संबंध नहीं है; यह शेल के स्वामित्व वाले विंडोज डेस्कटॉप के बारे में है। –

+0

"आपको इन विंडो में नहीं जाना चाहिए"। मेरे काम के लिए मुझे उन खिड़कियों का उपयोग करने की आवश्यकता है। उन खिड़कियों का उपयोग करने के लिए प्राथमिक हैं, आप प्रक्रियाओं में भी जा सकते हैं - http://en.wikipedia.org/wiki/DLL_injection :-), और कई सॉफ्टवेयर हैं जो इसे करते हैं । (मैं केवल वायरस के बारे में बात नहीं कर रहा हूं) ..LOL –

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