答案 0 :(得分:5)
要解决此问题,您可以使用以下任一选项制作应用程序DPI-Aware:
要使应用程序具有DPI-Aware,您可以将 Application Manifest File 添加到项目中。然后在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>
然后在 app.config 文件中,添加EnableWindowsFormsHighDpiAutoResizing
,将其值设置为true:
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
有关详细信息,请查看High DPI MSDN页面。
您可以在显示主表单之前使用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());
}
}
注意强>
虽然我之前使用SetProcessDPIAware
方法来解决问题,但在使用前阅读了说明:
如果DLL在初始化期间缓存dpi设置,则
SetProcessDPIAware
会受到可能的竞争条件的影响。因此,建议通过应用程序(.exe)清单设置dpi-aware,而不是通过调用SetProcessDPIAware
。
SetProcessDPIAware
仅适用于。{ “要求”部分中指定的操作系统。这种方法 在后续版本的操作中可能会出现意外行为 系统。请改用SetProcessDpiAwareness
。DLL应该接受主机进程的dpi设置而不是 自己致电
SetProcessDPIAware
。要正确设置,dpiAware 应该被指定为应用程序(.exe)清单的一部分。