.NET Framework >= 4.7 的更新答案
打开 app.config 并添加以下部分:
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
有关更多信息,请参阅:Windows 窗体中的高 DPI 支持.
.NET框架
要解决此问题,您可以使用以下任一选项使应用程序支持 DPI:
- 申请清单
- API 调用SetProcessDPIAware, SetProcessDpiAwareness or SetProcessDpiAwarenessContext
重要的提示:建议您设置进程默认DPI
通过应用程序清单(而不是 API 调用)进行感知。
使用应用程序清单文件
要使应用程序具有 DPI 感知能力,您可以添加应用清单文件到你的项目。然后在app.manifest
文件中,取消注释与 DPI-Awareness 相关的部分:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
然后在你的应用程序配置文件,添加EnableWindowsFormsHighDpiAutoResizing
将其值设置为 true:
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
有关详细信息,请查看 Microsoft 文档中的以下主题:
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());
}
}
Notes
-
正如上面已经提到的,建议您通过应用程序清单而不是 API 调用来设置进程默认 DPI 感知。
-
在使用 API 调用之前,请阅读文档以了解支持的操作系统以及 DLL 在初始化期间缓存 dpi 设置时可能出现的竞争条件。另请记住,DLL 应该接受主机进程的 dpi 设置,而不是 API 调用本身。
-
你可能会发现这个DpiHelper在 WinForms 中为 .NET Core 3.0 实现的类很有用。