アプリケーションのマニフェストでdpiAwareプロパティを「モニターごと」に設定できる必要があります。プロパティで使用できる選択肢は、DPI認識を有効または無効にすることだけです。これらの設定はどちらも私には機能しません。マニフェストをexeに埋め込まない場合は、アプリケーションに必要な動作を取得してから、マニフェストを手動で編集できます。マニフェストを自動的に生成して埋め込みたい。足りないものはありますか? (私はVisual Studio 2013を使用しています。)
Windows10の新機能はdpiAwarenessおよびdpiAwareであるため、この例を少し更新する必要があります。 dpiAwarenessが存在しない場合、設定はdpiAwareから継承されるため問題ありません。
DPI認識を完全に有効にするために、最新のWin10サポート(他の可能なオプションについては参照URLを参照)を使用します。これには、「permonitor」および「permonitorv2」が含まれます。あなたの質問がそれを尋ねるので、「システム」の代わりに。
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- legacy -->
<dpiAwareness xmlns="http://schemas.Microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to pm if pmv2 is not available -->
</asmv3:windowsSettings>
</asmv3:application>
disableにするには、逆の操作を行います(dpiAwareness
はサポートされていないため、必要ありません)。
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">unaware</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
次に、GDIオブジェクトを使用して独自のものをペイントする場合は、「gdiScaling」もあります。
<asmv3:application>
<asmv3:windowsSettings>
<gdiScaling xmlns="http://schemas.Microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
</asmv3:windowsSettings>
</asmv3:application>
参照: 最新のWindows 10ビルドの時点でのDPI認識に関するMicrosoft (大規模なプロジェクトでは少し面倒な場合でも、コードをDPI認識にする方法に関するチュートリアルもあります)
このマニフェストは機能し、<dpiAware>True/PM</dpiAware>
は最も重要な部分です:
<?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>
Windows 10 1607では、dpiAwareness
という名前の新しいプロパティが導入されました。フォールバックDPIスケーリングオプションを選択でき、存在する場合はdpiAware
プロパティをオーバーライドします。最高の互換性を得るには、これらの両方を指定し、アプリケーションがすべてのDPI認識レベルで動作することを確認する必要があります。
次のマニフェストは、Windows 10 1607+ではモニターごとのDPI認識バージョン2を有効にし、Windows7以降ではシステムDPI認識を有効にします。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-Microsoft-com:asm.v3">
<assemblyIdentity type="win32" name="MyApplication" version="1.0.0.0" processorArchitecture="AMD64"/>
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
<dpiAwareness xmlns="http://schemas.Microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> <!-- adding v1 as fallback would result in v2 not being applied to dialogs on capable systems -->
<gdiScaling xmlns="http://schemas.Microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> <!-- enables GDI DPI scaling -->
</asmv3:windowsSettings>
</asmv3:application>
</Assembly>
DPI認識を無効にするには、DPI認識を未指定のままにするか(デフォルトは非認識)、dpiAware
をfalse
として指定します。
また、Windows 101607で追加されたgdiScaling
プロパティにも注意してください。これにより、自動GDIスケーリングがtrue
に設定されている場合に有効になります。アプリケーションでGDI物を描くため。
参照:
Windows 10 1607以降の高DPIスケーリング
DPI対応アプリケーションの作成
アプリケーションマニフェスト