Obtener la resolución actual de la pantalla es algo inmediato si utilizamos el objeto System.screen, ya que su propiedad Bounds nos indica este dato en sus propiedades Width y Height:

screen.Bounds.Width
screen.Bounds.Height

Realmente sencillo. Lo que ya es harina de otro costal es hacer que mediante código se cambie la resolución actual de la pantalla. La plataforma .NET no ofrece soporte para esta operación desde ninguna de sus clases pero, como siempre, la API de Windows viene a nuestro rescate. Se trata de un viejo truco de los tiempos de Visual Basic.

Necesitamos utilizar las dos funciones siguientes de la biblioteca User32.dll:

· EnumDisplaySettings:

Ofrece toda la información necesaria sobre las pantallas disponibles en el sistema (puede haber más de una, claro, yo de hecho trabajo con una tarjeta dual que tiene dos monitores enchufados). Su definición es la siguiente (copiada de MSDN):

BOOL EnumDisplaySettings(
  LPCTSTR lpszDeviceName,  // display device
  DWORD iModeNum,          // graphics mode
  LPDEVMODE lpDevMode      // graphics mode settings
);
El primer parámetro es el dispositivo sobre el que queremos obtener información. Si se pasa un nulo trabajará con el que contiene a la ventana que se está ejecutando. El segundo parámetro se usa para seleccionar el modo gráfico del cual se quiere obtener información y el último recoge dicha información en una estructura de tipo LPDEVMODE.
Explicar todos estos parámetros y los de la estructura se sale del ámbito de un post como este y además vienen bien explicados en la documentación de la API, a la cual te remito para profundizar.

· ChangeDisplaySettings:

Esta función cambia los ajustes de la pantalla por defecto utilizando los parámetros que le proporcionemos. Existe una función ampliada idéntica, ChangeDisplaySettingsEx, que permite cambiar los de cualquier pantalla, pero a los efectos de este post me centraré en la más sencilla. Su definición es la siguiente:

LONG ChangeDisplaySettings(
  LPDEVMODE
lpDevMode// graphics mode
  DWORD dwflags         // graphics mode options
);

El primer parámetro es una estructura de tipo LPDEVMODE igual que la de la función anterior. El segundo indica cómo se aplicarán los cambios, es decir, si se aplicarán para todos los usuarios o sólo para el actual , si será un cambio temporal o permanente, etc... Al igual que antes aquí encontrarás la documentación completa de la función para profundizar.

Lo que nos queda es pasar las definiciones anteriores a C# (con ayuda de atributos DllImport y los InteropServices), y en unas pocas líneas podemos hacer cambios de resolución. No voy a escribir aquí todo el código puesto que queda un poco largo debido a las definiciones de la API en C#, pero he preparado un archivo de ejemplo que te puedes descargar pulsando aquí (ZIP, 1.3 KB), y que contiene todo lo necesario para cambiar la resolución. Si lo sigues teniendo a mano la documentación de las funciones mencionadas no tendrás problema en entenderlo.

La clase creada para el ejemplo permite cambiar la resolución escribiendo tan sólo:

Resolucion.ChangeRes(1024, 768);

Y ya está. Genera excepciones indicando posibles problemas y también cuando se deba reinicair el equipo para que los cambios surtan efecto.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor