c# - Problema gráfico de Windows Forms en el sistema operativo Windows 10
Para resolver el problema, puede hacer que su aplicación sea compatible con DPI utilizando cualquiera de estas opciones:
- Uso del archivo de manifiesto de la aplicación
- Usando SetProcessDPIAware
Uso del archivo de manifiesto de la aplicación
Para que la aplicación sea compatible con DPI, puede agregar un
archivo de manifiesto de aplicación
a su proyecto.
Luego, en el archivo
app.manifest
,
app.manifest
el comentario de la parte relacionada con la conciencia de DPI:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
Luego, en su archivo
app.config
, agregue
EnableWindowsFormsHighDpiAutoResizing
estableciendo su valor en verdadero:
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
Para obtener más información, consulte la página High DPI MSDN.
Usando SetProcessDPIAware
Puede usar el método
SetProcessDPIAware()
antes de mostrar su formulario principal para que su aplicación tenga en cuenta el dpi y evitar que Windows escale la aplicación.
También debe verificar que la versión de Windows sea mayor o igual que 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());
}
}
Nota
Si bien anteriormente utilicé el método
SetProcessDPIAware
para resolver el problema, pero leí la nota antes de usar:
SetProcessDPIAware
está sujeto a una posible condición de carrera si una DLL almacena en caché la configuración de dpi durante la inicialización. Por esta razón, se recomienda configurar elSetProcessDPIAware
dpi a través del manifiesto de la aplicación (.exe) en lugar de llamar aSetProcessDPIAware
.
SetProcessDPIAware
está disponible para su uso solo en los sistemas operativos especificados en la sección Requisitos. Este método puede tener un comportamiento inesperado en versiones posteriores del sistema operativo. UtiliceSetProcessDpiAwareness
enSetProcessDpiAwareness
lugar.Las DLL deben aceptar la configuración de dpi del proceso de host en lugar de llamar a
SetProcessDPIAware
. Para configurarse correctamente, dpiAware debe especificarse como parte del manifiesto de la aplicación (.exe).