Windows 10操作系统上的Windows窗体图形问题

当我在Windows 10中运行任何Windows窗体应用程序时,窗口内的图形看起来是扭曲的:

坏图像

在设计时,这不会发生:

好的形象

有没有人经历过这个?

(请打开图片以便更好看。)

要解决此问题,您可以使用以下任一选项使应用程序DPI-Aware:

  • 使用应用程序清单文件
  • 使用SetProcessDPIAware

使用应用程序清单文件

要使应用程序具有DPI-Aware,您可以将Application Manifest文件添加到项目中。 然后在app.manifest文件中,取消注释与DPI-Awareness相关的部分:

   true   

然后在app.config文件中,添加EnableWindowsFormsHighDpiAutoResizing将其值设置为true:

    

有关更多信息,请查看高DPI MSDN页面。

使用SetProcessDPIAware

您可以在显示主窗体之前使用SetProcessDPIAware()方法来设置应用程序dpi感知并防止窗口扩展应用程序。 您还应检查Windows版本是否大于或等于vista:

 static class Program { [DllImport("user32.dll", SetLastError = true)] static extern bool SetProcessDPIAware(); ///  /// The main entry point for the application. ///  [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)清单而不是通过调用SetProcessDPIAware来设置dpi-aware。

SetProcessDPIAware仅可用于“要求”部分中指定的操作系统。 此方法在后续版本的操作系统中可能具有意外行为。 请改用SetProcessDpiAwareness

DLL应该接受主机进程的dpi设置,而不是自己调用SetProcessDPIAware 。 要正确设置,应将dpiAware指定为应用程序(.exe)清单的一部分。