打开 app.config 并添加以下部分:
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
了解更多信息,请参见:Windows窗体中的高DPI支持。
为解决此问题,您可以使用以下任一选项使应用程序具有DPI感知能力:
重要提示: 建议您通过应用程序清单设置进程默认的 DPI 感知能力,而不是使用 API 调用。
要使应用程序具有DPI感知能力,可以向项目中添加一个应用程序清单文件。然后在 app.manifest
文件中删除与 DPI 感知相关的部分:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
接下来,在您的app.config文件中,添加EnableWindowsFormsHighDpiAutoResizing
设置其值为true:
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
如需更多信息,请参阅Microsoft docs中的以下主题:
SetProcessDPIAware
API调用示例您可以在显示主窗体之前使用SetProcessDPIAware()
方法设置应用程序的dpi,以防止Windows缩放应用程序。此外,您还应检查Windows版本是否大于或等于Vista:
static class Program
{
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetProcessDPIAware();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true);
Application.Run(new Form1());
}
}
注意事项
如上所述,建议您通过应用程序清单设置进程默认的 DPI 意识,而不是使用 API 调用。
在使用 API 调用之前,请阅读文档以了解支持的操作系统以及可能出现的竞争条件,如果 DLL 在初始化期间缓存 dpi 设置,则需要注意。此外,请记住,DLL 应接受主机进程的 dpi 设置,而不是 API 调用本身。
您可能会发现,.NET Core 3.0 中 WinForms 实现的DpiHelper
类很有用。