2011-11-09 6 views
12

मैं एक आवेदन डीपीआई जागरूकता बनाने की प्रक्रिया में हूं लेकिन मुझे अन्य अनुप्रयोगों से एचडब्ल्यूएनडी पर GetWindowRect करने की आवश्यकता है। मेरी समस्या यह है कि यह उन अनुप्रयोगों पर ठीक काम करता है जो डीपीआई जागरूक भी हैं लेकिन मैं कैसे पता लगा सकता हूं कि HWND हैंडल डीपीआई वर्चुअलाइज्ड है या नहीं। स्केल किया गया है इसलिए मैं इसे खुद स्केल कर सकता हूं? या क्या ऐसे अन्य एपीआई हैं जिन्हें मैंने याद किया है जो मुझे किसी अन्य प्रक्रिया से एचडब्ल्यूएनडी से डीपीआई के बारे में जागरूक तरीके से खिड़की का आकार देगा?बाहरी विंडो से GetWindowRect से एक डीपीआई जागरूक सही आरईसीटी प्राप्त करना

मैंने LogicalToPhysicalPoint की कोशिश की है लेकिन यह हमेशा असफल प्रतीत होता है, संभवतः क्योंकि एचडब्ल्यूएनडी मेरे आवेदन से संबंधित नहीं है।

+1

मुझे यह विश्वास करना बहुत मुश्किल लगता है कि 'GetWindowRect' मान लौटाता है जो इस पर निर्भर करता है कि अन्य ऐप्स वर्चुअलाइज्ड हैं या नहीं। क्या वास्तव में मामला है? और क्या आप एक शीर्ष स्तरीय खिड़की या एक बच्चे की खिड़की के रेक्ट के लिए पूछ रहे हैं? आप इस आयत के साथ क्या कर रहे हैं? –

+2

असल में मैंने इसे स्वयं से बाहर किया, मुझे DWMWA_EXTENDED_FRAME_BOUNDS के साथ पैरामीटर के रूप में DwmGetWindowAttribute को कॉल करना होगा। और हाँ यह इस तरह व्यवहार करता है, दोहराने के लिए काफी आसान है, एक डीपीआई जागरूक एप्लिकेशन बनाएं, अपने डीपीआई को> 144 पर सेट करें और इसे आजमाएं। मुझे लगता है कि इस तरह व्यवहार करने के लिए यह समझ में आता है क्योंकि वर्चुअलाइज्ड विंडो को यह एहसास नहीं होता है कि यह वर्चुअलाइज किया जा रहा है, और मूल्य अधिकांश प्रक्रिया के संदर्भ से आता है जो खिड़की से संबंधित है। –

+5

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

उत्तर

0

डीपीआई जागरूक ध्वज आवेदन स्तर पर सेट है और खिड़की का स्तर नहीं है, इसलिए यदि आप उस विशेष विंडो के अन्य विशेष अनुप्रयोग की प्रक्रिया को प्राप्त करने में सक्षम हैं तो आप उस विशेष प्रक्रिया के डीपीआई जागरूक ध्वज प्राप्त करने के लिए GetProcessDpiAwareness() फ़ंक्शन का उपयोग कर सकते हैं कृपया यह माइक्रोसॉफ्ट दस्तावेज https://msdn.microsoft.com/en-us/library/windows/desktop/dn302113(v=vs.85).aspx

4

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

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

विंडोज 8.1 के अनुसार, PhysicalToLogicalPoint और LogicalToPhysicalPoint फ़ंक्शन अब आवश्यक नहीं हैं और वास्तव में कुछ भी नहीं करते हैं। इन दोनों कार्यों के लिए दस्तावेज़ स्पष्ट रूप से ऐसी बाहर कॉल:

Windows 8.1 में, सिस्टम और अंतर-प्रक्रिया संचार के अतिरिक्त वर्चुअलाइजेशन मतलब यह है कि आवेदन पत्र के बहुमत के लिए, आप इन API जरूरत नहीं है। नतीजतन, विंडोज 8.1 में, PhysicalToLogicalPoint और LogicalToPhysicalPoint अब अंक परिवर्तित नहीं करते हैं। प्रणाली अपने सभी समन्वय अंतरिक्ष में एक आवेदन के लिए सभी अंक देता है।

आखिरी वाक्य मैंने ऊपर जो कहा है उसे phrasing का एक अलग तरीका है। सिस्टम कॉलर के डीपीआई जागरूकता के अनुसार मान देता है। यदि आपकी प्रक्रिया उच्च-डीपीआई जागरूक है, तो आपको वास्तविक मूल्य मिलेंगे। आपको मूल्यों को स्वयं स्केल करने की आवश्यकता नहीं है। यदि आप उच्च-डीपीआई नहीं जानते हैं, तो आप वास्तविक मूल्यों के बारे में झूठ बोलने के अधीन हैं। लेकिन यह समझ में आता है, क्योंकि यह माना जाता है कि आप सत्य को संभाल नहीं सकते हैं और उचित प्रतिक्रिया नहीं देंगे।

  1. प्रथम स्तर है:

    बस स्पष्ट होना, मैं वास्तव में Windows 8.1 के रूप में अब कर रहे हैं कि उच्च डीपीआई जागरूकता के दो स्तर, (और Windows 10 में जारी) का कहना है चाहिए , उच्च-डीपीआई जागरूकता के विंडोज विस्टा के साथ वापस रास्ता पेश किया। यह एप्लिकेशन की मेनिफेस्ट फ़ाइल में true की सेटिंग द्वारा इंगित किया गया है, और इसका मतलब यह है कि आप (एप्लिकेशन) सिस्टम डीपीआई से निपटने में सक्षम है जो 96 डीपीआई के क्लासिक डिफ़ॉल्ट के अलावा कुछ और सेट है।

    उपर्युक्त ज्ञान के आधार पर, हम जानते हैं कि यदि इस डीपीआई-जागरूकता सेटिंग के साथ एक प्रक्रिया एक एपीआई फ़ंक्शन को कॉल करती है जो स्क्रीन निर्देशांक लौटाती है, तो यह सिस्टम डीपीआई के संदर्भ में मान प्राप्त करेगी।

  2. फिर प्रति-मॉनीटर उच्च-डीपीआई जागरूकता के विंडोज 8.1 के साथ पेश किया गया नया स्तर है। यह एप्लिकेशन के मैनिफेस्ट में True/PM की सेटिंग द्वारा इंगित किया गया है, और इसका मतलब है कि आप (एप्लिकेशन) विभिन्न डीपीआई सेटिंग्स वाले विभिन्न मॉनीटर से निपटने में सक्षम हैं। दूसरे शब्दों में, जबकि अभी भी एक सिस्टम डिफ़ॉल्ट डीपीआई है (और यह 96 डीपीआई हो सकता है या यह कुछ और हो सकता है), ऐसे सिस्टम से जुड़े मॉनीटर हो सकते हैं जो एक अलग डीपीआई सेटिंग (सिस्टम डीपीआई के अलावा कुछ और) का उपयोग करते हैं।

    फिर से, उपरोक्त समझ के आधार पर, हम जानते हैं कि यदि प्रति-मॉनीटर उच्च-डीपीआई जागरूकता वाली एक प्रक्रिया एक एपीआई फ़ंक्शन को कॉल करती है जो स्क्रीन निर्देशांक देता है, तो यह मॉनिटर के डीपीआई के सापेक्ष वास्तविक निर्देशांक प्राप्त करेगा प्रश्न में खिड़की है।

अपनी प्रक्रिया बिल्कुल भी ध्यान रखें (प्रकट में कोई सेटिंग, या false), तो जब आप एपीआई कार्यों है कि स्क्रीन निर्देशांक लौट कहते हैं, आप निर्देशांक प्राप्त होगा डीपीआई नहीं है, तो/आभासी एक प्रणाली के आधार पर पहुंचा 96 डीपीआई के पूरे डीपीआई।

+0

"आपको 96 डीपीआई के सिस्टम-व्यापी डीपीआई के आधार पर स्केल किए गए/आभासी समन्वय प्राप्त होंगे।" - या सिस्टम डीपीआई क्या सेट है। – johnathon

+0

मुझे लगता है कि आप सही हैं कि सिस्टम कॉलर के डीपीआई जागरूकता के अनुसार मूल्य देता है। हालांकि, यदि आप dpiAware = true का उपयोग करते हैं तो आपको एकाधिक मान प्राप्त होने पर वास्तविक मान प्राप्त नहीं होंगे। विंडोज़ पहले भी मामले में प्राथमिक से मेल खाने के लिए गैर प्राथमिक स्क्रीन स्केल करता है। आपको dpiAware = true/PM होना चाहिए। –

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