2015-08-21 11 views
6

मैं एक क्लिकऑन एप्लिकेशन पर डीपीआई जागरूकता को अक्षम करने का प्रयास कर रहा हूं।
मुझे जल्दी पता चला, इसे मैनिफेस्ट में निर्दिष्ट करना संभव नहीं है, क्योंकि ClickOnce मैनिफेस्ट फ़ाइल में asm.v3 का समर्थन नहीं करता है।SetProcessDpiAwareness प्रभाव नहीं पड़ रहा है

मुझे मिला अगला विकल्प नया विंडोज फ़ंक्शन SetProcessDpiAwareness पर कॉल कर रहा था।

this ट्यूटोरियल के अनुसार

,

Call SetProcessDpiAwareness before you create the application window.

और this ट्यूटोरियल,

you must call SetProcessDpiAwareness prior to any Win32API call

आप बहुत जल्दी पर समारोह कॉल करने के लिए की है। तो, परीक्षण करने के लिए, मैं एक पूरी तरह से खाली WPF आवेदन बनाया है, और यह अपने पूरे अनुप्रयोग वर्ग बनाया:

Dpi set: True
Process_System_DPI_Aware
Set DPI error: System.ComponentModel.Win32Exception (0x80004005): Access is denied
System.ComponentModel.Win32Exception (0x80004005): The operation completed successfully

अभी भी सेट आवेदन क्यों है:

[DllImport("SHCore.dll", SetLastError = true)] 
private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness); 

[DllImport("SHCore.dll", SetLastError = true)] 
private static extern void GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS awareness); 

private enum PROCESS_DPI_AWARENESS 
{ 
    Process_DPI_Unaware = 0, 
    Process_System_DPI_Aware = 1, 
    Process_Per_Monitor_DPI_Aware = 2 
} 

static App() 
{ 
    var result = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware); 
    var setDpiError = Marshal.GetLastWin32Error(); 
    MessageBox.Show("Dpi set: " + result.ToString()); 

    PROCESS_DPI_AWARENESS awareness; 
    GetProcessDpiAwareness(Process.GetCurrentProcess().Handle, out awareness); 
    var getDpiError = Marshal.GetLastWin32Error(); 
    MessageBox.Show(awareness.ToString()); 

    MessageBox.Show("Set DPI error: " + new Win32Exception(setDpiError).ToString()); 
    MessageBox.Show("Get DPI error: " + new Win32Exception(getDpiError).ToString()); 
} 

3 संदेश बॉक्स इस सामग्री को दिखाने DPI_Aware करने के लिए? क्या यह कॉल पर्याप्त जल्दी नहीं है?
एप्लिकेशन वास्तव में डीपीआई स्केलिंग का अनुभव करता है।

जब मैं प्रकट परिभाषा का उपयोग करें:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware> 
    </windowsSettings> 
</application> 

यह Process_DPI_Unaware वापसी करता है।

संपादित करें 1:
अब हथियाने Marshal.GetLastWin32Error() सीधे PInvoke तरीकों के बाद, यह अब वास्तव में एक त्रुटि देता है।

उत्तर

5

SetLastError और GetLastWin32Error के साथ सावधान रहें, MessageBox.Show जैसे किसी भी कॉल के परिणामस्वरूप इसका परिणाम प्रभावित होगा। अपनी मूल विधि को कॉल करने के बाद हमेशा अंतिम त्रुटि प्राप्त करना सुनिश्चित करें।

तो यह बहुत अच्छा हो सकता है कि आपको अपेक्षित व्यवहार मिल रहा है लेकिन त्रुटि कोड द्वारा गुमराह किया जा रहा है। http://blogs.msdn.com/b/oldnewthing/archive/2015/08/19/10636096.aspx

संपादित

काफी क्या पहुँच से मना कर ... लेकिन वहाँ एक सरल और प्रभावी चाल है कि डीपीआई जागरूकता को निष्क्रिय है के कारण के बारे में सुनिश्चित नहीं हैं:

एक पूर्ण विवरण के लिए इस ब्लॉग पोस्ट देखें

संपादित अपने AssemblyInfo.cs और जोड़ने निम्नलिखित:

[assembly: DisableDpiAwareness] 

स्रोत: https://code.msdn.microsoft.com/windowsdesktop/Per-Monitor-Aware-WPF-e43cde33 (PerMonitorAwareWPFWindow.xaml.cs में टिप्पणियां)

+0

आह! बेशक! कृपया मेरा संपादित कोड देखें, "डीपीआई त्रुटि सेट करें: सिस्टम। कॉम्पोनेंट मॉडेल। Win32Exception (0x80004005): एक्सेस अस्वीकार कर दिया गया है" –

+2

किसी अन्य दृष्टिकोण के लिए मेरा संपादन देखें। – Aybe

+1

वह बेकार ढंग से काम किया! धन्यवाद! –

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