100%(または[XPスタイルのDPIスケーリング]チェックボックスがオンになっている場合は125%)を超えると、デフォルトでWindowsがUIのスケーリングを引き継ぎます。これは、アプリに出力をビットマップにレンダリングさせ、そのビットマップを画面に描画することによって行われます。そのビットマップを再スケーリングすると、必然的にテキストがぼやけて見えます。「DPI仮想化」と呼ばれる機能で、古いプログラムを高解像度モニターで使用できるようにします。
<dpiAware>
マニフェストに要素を追加することで、より高いDPI設定を処理できることを明示的に通知する必要があります。MSDNページはここにありますが、UAC設定が省略されているため、完全ではありません。プロジェクト+新しいアイテムの追加、「アプリケーションマニフェストファイル」を選択します。マニフェストテキストを編集するか、これをコピーして貼り付けます。
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<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>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
Main()メソッドでSetProcessDPIAware()をピンボークすることもできます。たとえば、ClickOnceを使用してデプロイする場合に必要です。
[STAThread]
static void Main() {
if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); // Edit as needed
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
UPDATE、VS2015 Update 1以降を使用する場合、この一般的なニーズは最終的に少し簡単になります。追加されたマニフェストにはすでに関連するディレクティブがあり、コメントを削除するだけです。
この投稿を見つけることができるように検索するためのキーワード:dpiAware