Source: http://elguille.info/vb/API/resolucionpantalla.htm
Timestamp: 2017-05-23 10:41:09+00:00

Document:
Especial resolución de la pantalla
Especial resolución pantalla
Tres cosillas relacionadas con la resolución de la pantalla usando el API de Windows
Publicado: 04/Nov/2001
Actualizado: 04/Nov/2001
Aquí tienes tres cosillas relacionadas con la resolución de la pantalla usando el API de Windows.
Si quieres bajarte el código de ejemplo, usa este link. cambiarres2.zip (6.72 KB)
Nota:He probado el código en Windows XP y no funciona, al menos no cambia la resolución.Aunque si que muestra la resolución actual, así como el número de colores.También muestra todos los valores disponibles, antes te comenté que no lo hacía y era porque hice la prueba desde un "terminal" y no desde el equipo en el que está instalado el XP, y ¡al estar el equipo conectado al Windows XP sólo trabaja con una resolución!Al final de la página te muestro la imagen del formulario funcionando en el Windows XP.
He estado mirando el Platform SDK a ver si dice algo al respecto, pero no he encontrado nada especial.Lo único que he encontrado al revisar la documentación de estas funciones es que hay que asignar a DevM.dmSize con el tamaño de la variable: DevM.dmSize = Len(DevM)En fin, si me entero de algo nuevo...
He cambiado el contenido del fichero ZIP, pero puede que el mostrado en esta página no tenga esa asignación que acabo de comentarte: DevM.dmSize = Len(DevM)
Nota: Si funciona en Windows XP
Averiguar la resolución actual y número de colores, usando API:Seguramente sabrás cómo averiguar la resolución de la pantalla usando el objeto Screen.De esa forma podemos averiguar el alto y ancho de la misma, pero no el número de colores.Se usaría de esta forma:
Para poder saber el número de colores, usa este código, (tendrás que usar las declaraciones del API de Windows que te indico un poco más abajo)
' Esta llamada a EnumDisplay es para obtener la resolución actual
' mediante una llamada al API.
' Código a poner en las declaraciones del formulario
' API para cambiar la resolución de la pantalla
Private Declare Function ChangeDisplaySettings Lib &quot;user32&quot; Alias &quot;ChangeDisplaySettingsA&quot; _
Private Declare Function EnumDisplaySettings Lib &quot;user32&quot; Alias &quot;EnumDisplaySettingsA&quot; _
' Las declaraciones de estas constantes están en: Wingdi.h
Cambiar / restaurar la resolución de forma rápida:Rápida, lo que se dice rápida es también la siguiente que aún te tengo que mostrar, ésta lo que hace es cambiar la resolución a los valores que tu le indiques, ya que en ocasiones lo que realmente te puede interesar es poner la resolución que tu programa necesita.
Es decir, hacer algo tan sencillo como esto:CambiarRes 800, 600, 32
En el código de ejemplo, te muestro todos los pasos, para saber cual es la resolución actual para después volver a ponerla.
El formulario de prueba tiene este aspecto:
Y este es el código completo del formulario de prueba:
' Cambiar y restaurar la resolución de la pantalla, (método rápido) (04/Nov/01)
Private Sub cmdCambiarRes_Click()
' Cambiar la resolución a 800x600 colores de 32bits
' o a la indicada en los textboxes
CambiarRes txtResNueva(0), txtResNueva(1), txtResNueva(2)
Private Sub cmdRestaurarRes_Click()
' Poner la resolución que había antes,
' si se ha cambiado...
If mResolucionCambiada Then
CambiarRes mResAncho, mResAlto, mResBits
mResolucionCambiada = False
' La he probado en Windows 2000,
' si no funciona en Windows 9x usa esta otra forma:
'    With Screen
'        mResAlto = (.Height \ .TwipsPerPixelY)
'        mResAncho = (.Width \ .TwipsPerPixelX)
'    mResBits = 32&
' Mostrar la resolución actual
txtResActual.Text = CStr(mResAncho) & &quot; x &quot; & CStr(mResAlto) & &quot; x &quot; & CStr(mResBits)
' Asignar la resolución a la que se cambiará:
txtResNueva(0).Text = &quot;800&quot;
txtResNueva(1).Text = &quot;600&quot;
txtResNueva(2).Text = &quot;16&quot;
' Si queremos cambiar en el form_load
'CambiarRes 800, 600, 16
Private Sub CambiarRes(ByVal Ancho As Long, ByVal Alto As Long, ByVal Colores As Long)
' Cambiar la resolución de la pantalla                          (04/Nov/01)
' Lo que se va a cambiar
DevM.dmBitsPerPel = Colores
Private Sub txtResActual_GotFocus()
' Seleccionar el texto al entrar en el textbox
With txtResActual
Private Sub txtResNueva_GotFocus(Index As Integer)
With txtResNueva(Index)
Enumerar las resoluciones disponibles y cambiar/restaurar la resolución de la pantalla:
En esta ocasión, el ejemplo que te voy a mostrar además de permitir averiguar la resolución actual y cambiar a una nueva, te muestra todas las resoluciones posibles, incluido el número de colores.
Te comento que he probado este código en Windows XP y no funciona lo de cambiar la resolución.Aunque si lista todos los valores posibles y por tanto muestra los valores actuales, tanto en el tamaño como en el número de colores.Al final de la página tienes una captura del formulario corriendo en el Windows XP.Este es el aspecto del formulario de pruebas (en Windows 2000):
' Prueba para cambiar y restaurar la resolución de la pantalla      (04/Nov/01)
' Parte del código es del ejemplo de cambiar la resolución
' publicado en mis páginas: http://www.elguille.info/vb/utilidades/cambiar_res.htm
' También tengo que reconocer que dicha información la basé en un artículo
' de la Knowledge Base de Microsoft:
' Changing the Screen Resolution at Run Time in Visual Basic 4.0
' Tipo y array para guardar las resoluciones disponibles
Private mNuevaRes As Long
CambiarRes Disponibles(mNuevaRes).Width, Disponibles(mNuevaRes).Height, Disponibles(mNuevaRes).Bits
mResolucionCambiada = True
' Poner la resolución que había antes
' Quita los comentarios para sólo hacerlo si se ha cambiado antes
'If mResolucionCambiada Then
' La posición cero es para la resolución actual
ReDim Disponibles(0)
With Disponibles(0)
.Width = mResAncho
.Height = mResAlto
.Bits = mResBits
txtResNueva.Text = &quot;&quot;
' Llenar el listbox con las resoluciones posibles
ResolucionesDisponibles
If chkRestaurarAlCerrar.Value Then
Private Sub ResolucionesDisponibles()
' Vaciar el combo y el array
lstResoluciones.Clear
' El valor de la posición CERO es la actual
ReDim Preserve Disponibles(0)
' Mostrar en el listbox las resoluciones disponibles
s = Format$(DevM.dmPelsWidth, &quot; @@@@&quot;) & &quot; x &quot; & _
Format$(DevM.dmPelsHeight, &quot;@@@@&quot;) & &quot; &quot; & _
Format$(DevM.dmBitsPerPel, &quot;@@&quot;) & &quot; bits&quot;
lstResoluciones.AddItem s
' Guardar esos datos en nuestro array
' de las resoluciones disponibles
ReDim Preserve Disponibles(i)
Private Sub lstResoluciones_Click()
i = lstResoluciones.ListIndex + 1
mNuevaRes = i
' Mostrar en el label la resolución seleccionada
txtResNueva.Text = Disponibles(i).Width & &quot; x &quot; & _
Disponibles(i).Height & &quot;  &quot; & _
Disponibles(i).Bits & &quot; bits&quot;
El segundo ejemplo funcionando en el Windows XP
Arriba tienes el link para el código de los dos proyectos de prueba.

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución

 resolución 
 resolución 
 resolución