2010-05-31 14 views
7

मैं अपनी प्रक्रिया में एक बाल विंडो पर एक विंडो हैंडल प्राप्त करने की कोशिश कर रहा हूं और मेरे पास एकमात्र जानकारी विंडो क्लास नाम है। क्या कोई Win32 फ़ंक्शंस है जिसका उपयोग मैं कर सकता हूं? मैं इसे सी # से कर रहा हूं।विंडो क्लास नाम से विंडो हैंडल प्राप्त करें

थोड़ा और विस्तार: यह एक विजुअल स्टूडियो प्लगइन है, जो सी # में लिखा गया है। तो मेरी प्रक्रिया दृश्य स्टूडियो है, जिसमें बहुत सारी खिड़कियां हैं। उनमें से एक खिड़की वर्ग "VsTipWindow" है। मुझे उस खिड़की की तत्काल मूल खिड़की नहीं पता है, मेरे पास कक्षा का नाम है। क्या खिड़की के हैंडल को पाने के लिए मेरे पास कोई रास्ता है?

उत्तर

0

सबसे पहले यह ध्यान दिया जाना चाहिए कि खिड़कियों और खिड़की वर्गों के बीच 1 से 1 रिश्ते नहीं हैं, एक से अधिक खिड़की एक ही कक्षा का उपयोग कर सकती हैं।

मुझे लगता है कि आपका एकमात्र विकल्प EnumChildWindows को शीर्ष स्तर के विजुअल स्टूडियो विंडो से शुरू करना है (या विंडो पदानुक्रम में कुछ अन्य विंडो जो आप जानते हैं कि VsTipWindow विंडो का दादा है) कॉलबैक फ़ंक्शन में EnumChildWindows आप GetClassName को कॉल करेंगे और VsTipWindow के साथ स्ट्रिंग की तुलना जब तक आपको विंडो नहीं मिलती।

चूंकि आपने अज्ञात माता-पिता के बारे में बात की है, इसलिए मुझे लगता है कि आप एक बच्चे की खिड़की के बाद हैं, लेकिन यदि यह विंडो एक शीर्ष स्तरीय विंडो है, तो आपको EnumWindows का उपयोग करने की आवश्यकता है (और आपको शायद यह सुनिश्चित करने के लिए GetWindowThreadProcessId का उपयोग करना चाहिए सही प्रक्रिया भी आप के बाद कि classname के साथ एक खिड़की)

(मुझे यकीन है कि नेट कार्यों कि देशी एपीआई के रूप में ही काम करते हैं है कर रहा हूँ, या आप PInvoke होगा)

+1

धन्यवाद, यह चाल है।हालांकि "EnumChildWindows recursivly" स्पष्ट होने के बावजूद, आप वास्तव में शीर्ष स्तर की विंडो हैंडल के साथ इसे एक बार कॉल करते हैं, EnumChildWindows फ़ंक्शन स्वयं ही रिकर्सन करता है। –

2

FindWindow यह Win32 कॉल है जिसे आप चाहते हैं (या FindWindowEx यदि उस विशेष श्रेणी के नाम के साथ एक से अधिक विंडो हैं, और FindWindow उस व्यक्ति को वापस नहीं लौटा रहा है जिसे आप ढूंढ रहे हैं)।

+0

मैं सिर्फ अपने प्रश्न का 'findwindow' टैग देखा से एक खिड़की की संभाल प्राप्त कर सकते हैं उपयोगी है - अच्छा लगता है। :) – MusiGenesis

+0

FindWindow केवल शीर्ष स्तर की विंडो पाता है, FindWindowEx वह है जो आप वास्तव में मतलब है, लेकिन Enum फ़ंक्शन को कॉल करना सुरक्षित है, इसलिए आप किसी भी विंडो को याद नहीं करते – Anders

+0

@Anders: पहले से ही FindWindowEx लिंक जोड़ा गया है। इस तरह के अधिकांश मामलों में, FindWindow आपको इच्छित विंडो लौटाता है। सबसे सुरक्षित दृष्टिकोण विंडोज़ कक्षा के नामों के साथ पहली जगह में नहीं है। – MusiGenesis

0

एक Win32 खिड़की लगता है कक्षा नियंत्रण का सामान्य कार्यान्वयन है, खिड़कियों का संभाल नियंत्रण का उदाहरण है। तो आपके पास एक ही विंडो क्लास (उदा .: EDIT) के साथ एकाधिक विंडो हैंडल होंगे। कड़ाई से बोलते हुए, खिड़की की कक्षा खिड़की की प्रक्रिया के लिए सूचक है।

.net (और यहां तक ​​कि एमएफसी) जैसे फ्रेमवर्क सभी विंडोज़ नियंत्रणों के लिए कुछ विंडो वर्ग साझा करते हैं, और फिर वे उपयुक्त नियंत्रणों को भेज देंगे (यानी उनके पास एक सामान्य खिड़की प्रक्रिया है)। विजुअल स्टूडियो या ऑफिस जैसे बड़े एप्लिकेशन के लिए यह वही है।

तो यह अपनी खिड़की कक्षा के माध्यम से एक विशिष्ट खिड़कियों का पता लगाने में बहुत मुश्किल है। हालांकि, आप FindWindow के साथ एक विशिष्ट विंडोज क्लास वाली सभी विंडो का आकलन कर सकते हैं, आपको विंडो विंडो भी मिल जाएगी जो आपकी मदद कर सकती है। GetWindowThreadProcessId का उपयोग करके आप यह पता लगा सकते हैं कि विंडो विजुअल स्टूडियो से संबंधित है या नहीं।

+0

ठीक है। लेकिन इस विशेष मामले में मुझे पता है कि उस विशेष खिड़की वर्ग के साथ एक समय में केवल एक सक्रिय खिड़की होने के लिए यह कोई समस्या नहीं है। मुझे शायद यह कहना चाहिए था कि प्रश्न में :) –

1

बस में अतिरिक्त जानकारी ..
शायद यह पता है कि तुम एक बिंदु
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

+1

विंडोफ्रॉमपॉइंट यहां लागू नहीं होता है, जब तक कि आप यह सुझाव नहीं दे रहे हैं कि उपयोगकर्ता को इस विंडो पर कर्सर को एक विशिष्ट समय या घटना पर इंगित करना होगा! – Anders

+1

@ एंडर्स, वीएसटीपविंडो एक टूलटिपविंडो का एक प्रकार है। टूलटिपविंडोज़ में प्रकृति दिखने की प्रकृति होती है जब माउस दूसरी विंडो पर होता है और जब माउस खिड़की छोड़ देता है तो गायब हो जाता है। लेकिन फिर भी WindowFromPoint के पास माउस बिंदु से कुछ लेना देना नहीं है। यह हर मनमानी बिंदु के एक खिड़की हैंडल प्रदान करता है। अगर यह यहां लागू होता है या नहीं, तो सवाल नहीं है, कृपया मेरे पहले 3 शब्द पढ़ें। मैं सिर्फ एक और विचार देना चाहता हूं अगर इनार्स का पहला विचार काम नहीं करेगा। हम यह भी नहीं जानते कि वह क्या करने जा रहा है – OlimilOops