2014-07-16 2 views
1

자체 모니터를 DPI 인식 응용 프로그램 매니페스트에서 인식하는 WPF 응용 프로그램은 Visual Studio 2013에서 실행될 때 시스템 DPI 인식으로 실행됩니다 (디버그 및 해제). 독립 실행 형 응용 프로그램은 Per-Monitor DPI 인식으로 실행됩니다. Windows Desktop 용 Visual Studio 2012 Express에 정확히 동일한 코드가있는 응용 프로그램을 만들었습니다.이 경우 Visual Studio에서도 Per-Monitor DPI 인식으로 실행됩니다.Per-Monitor DPI 인식 응용 프로그램은 VS2013에서 시스템 DPI 인식으로 실행됩니다.

그래서 저는 Visual Studio 2013에서 응용 프로그램이 Per-Monitor DPI 인식으로 실행되지 못하게합니다. 누구나 단서 또는 제안이 있습니까?

using System; 
using System.Runtime.InteropServices; 
using System.Windows; 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 

     var awareness = GetDpiAwareness(); 
     if (awareness.HasValue) 
      this.Title = awareness.Value.ToString(); 
    } 

    private PROCESS_DPI_AWARENESS? GetDpiAwareness() 
    { 
     var ver = Environment.OSVersion.Version; 
     if (!((6 == ver.Major && 3 <= ver.Minor) || (7 <= ver.Major))) 
      return null; 

     PROCESS_DPI_AWARENESS value; 
     var result = GetProcessDpiAwareness(IntPtr.Zero, out value); 
     if (result != 0) 
      return null; 

     return value; 
    } 

    [DllImport("Shcore.dll")] 
    private static extern int GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS value); 

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

와 응용 프로그램 매니페스트는 다음과 같다 : 다음과 같이 테스트 애플 리케이션의 뒤에

코드는 한스으로

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 
    </application> 
    </compatibility> 

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

</asmv1:assembly> 
+0

코드가 [권장 방법] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee308410%28v=vs.85%29.aspx)과 많이 다르게 보입니다. 이 작업을 수행. 적어도 샘플 앱을 사용하여 디버거로 실행하는 것과 실제로 관련이 있는지 확인하십시오. 그것이하는 경우에 접대 과정을 무능하게하는 것은 시도하는 무작위 것 일 것입니다. –

+0

@ 한스 당신의 커밋을 주셔서 감사합니다. 이 응용 프로그램은 운영 체제에서 WM_DPICHANGED 메시지를 받기위한 필수 조건이므로 응용 프로그램이 Per-Monitor DPI를 인식하고 있는지 여부를 확인하기위한 것입니다. 응용 프로그램 매니페스트를 사용하여이 응용 프로그램에 통보하면 Per-Monitor DPI가 권장됩니다. – emoacht

+0

확실히 내가 WPF 앱에 대한 "권장 방법"에 대한 링크를 제공했는지 확인하십시오. WPF는 이미 시스템 DPI 인식 기능을 내장하고 있기 때문에 그렇게 간단하지 않습니다. 권장 사항을 사용하고 싶지 않다면 디버거가 없어도 문제가되지 않습니다. –

답변

3

는 호스팅 프로세스를 비활성화에 대한 제안이 문제가 될 것 같다 debegger의 응용 프로그램 매니페스트를 무시하는 Visual Studio 2013의 알려진 문제로 인한 것입니다.

  • App Manifest Ignored
    • 그래서, 나는 비주얼 스튜디오 2013 업데이트 3 RC를 시도하고 문제가왔다. 이 문제는 업데이트 3에서 수정 된 것 같습니다. 이제 응용 프로그램 매니페스트가 올바르게 반영되고 테스트 응용 프로그램이 VS2013의 Per-Monitor DPI로 인식됩니다. 그게 전부 야.

    관련 문제