2015-08-19 5 views
5

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

मुझे पहले से ही पता है कि एक WPF अनुप्रयोग में एक मैनिफेस्ट जोड़ना संभव है, डीपीआई जागरूकता के लिए अनुभाग को असम्बद्ध करें, और इसे True/PM पर सेट करें। यह प्रोग्राम को विंडोज 8.1 और 10 में प्रति-मॉनिटर डीपीआई-जागरूक होने की अनुमति देता है (इस प्रकार विभिन्न मॉनीटरों पर साफ और तेज दिखता है), लेकिन विंडोज 7 में सिस्टम-जागरूक के रूप में चलाया जाता है।

लेकिन क्या हम एक कदम बेहतर कर सकते हैं ? माइक्रोसॉफ्ट neat tutorial here that shows how to create a Per-Monitor DPI-Aware WPF एप्लिकेशन प्रदान करता है। वे वास्तव में <Window> को प्रतिस्थापित करने के लिए सी ++ में एक नई वस्तु बनाते हैं जो मॉनीटर के बीच डीपीआई परिवर्तन का पता लगाने के लिए विंडोज 8.1 एपीआई का उपयोग नहीं करता है, लेकिन फिर री-साइज रनटाइम पर एप्लिकेशन, प्रभावी रूप से डीपीआई में परिवर्तन से मेल खाता है । अंतिम परिणाम यह है कि न केवल प्रति-डीपीआई ऐप और तेज दिखने वाला ऐप है, लेकिन विभिन्न आकारों के बड़े और छोटे मॉनीटरों के बीच स्विच करते समय, ऐप उपयोगकर्ता को उसी भौतिक आकार को बदलने के लिए देखता है (इंच या सेंटीमीटर में) स्क्रीन।

माइक्रोसॉफ्ट के Win32 कोड के नकारात्मक पक्ष यह है कि यह विंडोज 7 के साथ पिछड़ा संगत नहीं है। आवेदन क्रैशिंग में 7 परिणामों में चलाने की कोशिश कर रहा है।

मैं this article on Dr.Dobbs और this one by Kenny Karr से गुजर चुका हूं लेकिन चीजों को काम करने के लिए पर्याप्त एपीआई को समझ नहीं पा रहा हूं।

किसी को भी, पर-मॉनिटर है कि बारे में पता एक आवेदन माइक्रोसॉफ्ट के कोड के लिए इसी तरह कुछ करने के लिए एक तरह से है, जहां Windows 8.1 में और नए का पता है होगा वास्तव में परिवर्तन आकार जब मॉनिटर के बीच घूम रहा है, लेकिन सिस्टम-अवेयर के रूप में चलाता है विंडोज 7 में?

उत्तर

-1

मैंने कोड को नहीं देखा है, लेकिन मेरा अनुमान है कि क्रैश 7 में जीतने वाले मूल तरीकों के कारण दुर्घटना हुई है। इसे ठीक करने का तरीका देशी विधियों के रैपर को संशोधित करना है, उदाहरण के लिए (छद्म कोड):

public int GetDPIOfMonitor(IntPtr monitorHandle) 
{ 
    if (Enviroment.OSVersion >= "6.2") // win 8 and above 
    { 
     return NativeMethods.PInvoke.GetMonitorDPI(monitorHandle); 
    } 
    else return systemDPI; 
} 

इस तरह से आप 7 के तहत दुर्घटना नहीं है, क्योंकि आप लापता देशी तरीकों बुला नहीं कर रहे हैं।

+0

यह कुछ समय हो गया है क्योंकि मैं इस समस्या से अधिक हूं, लेकिन मैंने थोड़ा और सीखा है ... मेरा मानना ​​है कि आपका समाधान रनटाइम पर असफल हो जाएगा। मेरा सिद्धांत यह है कि जब एप्लिकेशन 'सार्वजनिक int GetDPIOfMonitor (IntPtr monitorHandle)' में प्रवेश करता है, तो सीएलआर स्मृति में 'मूलभूत विधि' लोड करने का प्रयास करेगा, जो अभी भी विंडोज 7 पर दुर्घटना का परिणाम होगा। इसके आसपास एक तरीका यह होगा कि ' NativeMethod.PInvoke.GetMonitorDPI (मॉनिटरहैंडल) वापस करें; 'स्वयं को किसी अन्य विधि में, जिसका अर्थ है कि सीएलआर आवश्यक कोड लोड नहीं करेगा यदि कथन विफल हो। मैं सुनिश्चित करने के लिए दोनों परीक्षण करना चाहता हूं। – ohioDeveloper

+0

emoacht एक [लाइब्रेरी विकसित कर रहा है जो इस काम को बहुत से संभाल सकता है और विंडोज 7 और ऊपर चलाता है] (https://github.com/emoacht/WpfMonitorAware)। मैंने इसका उपयोग नहीं किया है क्योंकि मैं वर्तमान में विंडो क्रोम को समझ नहीं पा रहा हूं, इसे [फ्लुएंट रिबन] (https://github.com/fluentribbon/Fluent.Ribbon) जैसे पुस्तकालयों के साथ गठबंधन करने के लिए पर्याप्त है। – ohioDeveloper

+0

@ohio डेवलपर - आप गलत हैं। ऐसा नहीं है कि कैसे काम करता है/काम करता है। पी/invoke सिर्फ एक स्ट्रिंग निश्चित है। यह पूरी तरह से मनमाना है। एक बार जब आप वास्तव में पी/इनवॉक विधि को कॉल करते हैं तो इसे केवल वैधता के लिए चेक किया जाएगा। इस तरह आप अपने ऐप में सभी प्रकार की चीजों के लिए परिभाषाओं को पी/आविष्कार कर सकते हैं, इससे कोई फर्क नहीं पड़ता कि वे मौजूद नहीं हैं। मैंने ऐप विकसित किए हैं जिन्हें XP और 7 में चलाना था। बेशक XP में मूल विधियां नहीं थीं जिनमें 7 थी।उपरोक्त छद्म कोड का उपयोग पूरी तरह से काम किया और असफल नहीं हुआ। – Marko

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