cambie resolucion pero al salir no vuelve la original

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
cloferba
Mensajes: 15
Registrado: 10 Oct 2009, 16:21

cambie resolucion pero al salir no vuelve la original

Mensaje por cloferba »

utilizo el siguiente codigo para cambiar la resolucion a 1024

Código: Seleccionar todo

_ChangeScreenRes(1024,768,32,60)
Func _ChangeScreenRes($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xffff
Local Const $WM_DISPLAYCHANGE = 0x007E
If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
If @error Then
$B = 0
SetError(1)
Return $B
Else
$B = $B[0]
EndIf
If $B <> 0 Then
DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($DEVMODE, 4, $i_Width, 2)
DllStructSetData($DEVMODE, 4, $i_Height, 3)
DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
If @error Then
$B = -1
Else
$B = $B[0]
EndIf
Select
Case $B = $DISP_CHANGE_RESTART
$DEVMODE = ""
Return 2
Case $B = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
$DEVMODE = ""
Return 1
Case Else
$DEVMODE = ""
SetError(1)
Return $B
EndSelect
EndIf
EndFunc
el tema es que no se como hacer para que al salir del script, vuelva la resolucion que tenia anteriormente el monitor..

alguna ayuda?
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por BasicOs »

Usa la variables de "Macro Reference" de la Ayuda:

Código: Seleccionar todo

Resolucion antes
$antesH=@DesktopHeight
$antesW=@DesktopWidth
$antesD=@DesktopDepth
$antes$=@DesktopRefresh
_ChangeScreenRes(1024,768,32,60)

Resolución después
_ChangeScreenRes(con las variables antes)
Salu22:)
cloferba
Mensajes: 15
Registrado: 10 Oct 2009, 16:21

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por cloferba »

Gracias, pero sin embargo hay algo que no funciona..

le agregue un sleep para que en 5 segundos vuelva a la resolucion original, todo anda bien, se cambia la resolucion pero no vuelve a la original luego de 5 segundos..

Código: Seleccionar todo

; Define la resolucion que se aplicara
$Width = 1024
$Height = 768
$BitsPerPixel = 32
$RefreshRate = 60
; Graba la resolucion actual
$antesH=@DesktopHeight
$antesW=@DesktopWidth
$antesD=@DesktopDepth
$antesR=@DesktopRefresh

_ChangeScreenRes(1024,768,32,60)
Func _ChangeScreenRes($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xffff
Local Const $WM_DISPLAYCHANGE = 0x007E
If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
If @error Then
$B = 0
SetError(1)
Return $B
Else
$B = $B[0]
EndIf
If $B <> 0 Then
DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($DEVMODE, 4, $i_Width, 2)
DllStructSetData($DEVMODE, 4, $i_Height, 3)
DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
If @error Then
$B = -1
Else
$B = $B[0]
EndIf
Select
Case $B = $DISP_CHANGE_RESTART
$DEVMODE = ""
Return 2
Case $B = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
$DEVMODE = ""
Return 1
Case Else
$DEVMODE = ""
SetError(1)
Return $B
EndSelect
EndIf
EndFunc

; Cambia la resolucion a 1024
_ChangeScreenRes(1024,768,32,60)
; Luego de 5 segundos..
sleep(5000)
; Restaura la resolucion anterior
_ChangeScreenRes($antesW,$antesH,$antesD,$antesR)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por BasicOs »

Comprueba estos datos:
Los datos que devuelva la variable $antes.... con un msgbox, y los apuntas y luego miras si están los parámetros en el orden correcto, si no puedes poner a mano la resolución actual sin antes, (miras en panel de control, pantalla), y lo compruebas manualmente ;) :smt025

1024,768,32,60 --> datos anteriores -> 800,600,32,60???
Salu22:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por Chefito »

Mmmmm....a mi me pasa lo mismo a al usuario de este post: http://www.autoitscript.com/forum/topic ... msearch__1
Tengo una resolución 1366x768 en mi portatil, y esta función no me la puede asignar. En cambio, 1360x768 sí :smt017 .
Tengo lo mismo que el usuario: w7 home 64 bits.
Habría que invertigar porque la api no puede pasar esa resolución.

Por cierto, para que se ejecute algo justo antes de salir del script mira en la ayuda la función OnAutoItExitRegister.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
cloferba
Mensajes: 15
Registrado: 10 Oct 2009, 16:21

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por cloferba »

BasicOs escribió:Comprueba estos datos:
Los datos que devuelva la variable $antes.... con un msgbox, y los apuntas y luego miras si están los parámetros en el orden correcto, si no puedes poner a mano la resolución actual sin antes, (miras en panel de control, pantalla), y lo compruebas manualmente ;) :smt025

1024,768,32,60 --> datos anteriores -> 800,600,32,60???
Salu22:)
el problema es que la aplicacion no la ejecutare solo en mi pc, sino en otras pc con otras resoluciones

me sorprende que autoit no tenga al menos una manera de lograr esto :S
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por Ximorro »

No había pensado que fuera tan complicado cambiar la resolución, parecía algo sencillo pero por lo visto es bastante complicado... :smt017

El problema igual está en la función que estáis usando, en el post que enlaza Chefito con el problema, cuando el usuario se digna a poner el código, ya que no pone un enlace, se ve que la función es de PartyPooper. Buscando en el foro he encontrado la entrada original donde se expone la función y... el autor ha editado el primer post y ha puesto esto:
"Removed - use one of the other Screen Resolution Changing UDF's."
O sea:
"Borrado - usa una de las otras UDF para Cambio de Resolución de Pantalla."

Está aquí:
http://www.autoitscript.com/forum/topic ... anging-udf

O sea, que algún problema tendrá esa función cuando la ha retirado (el post es de 2006 así que pueden haber cambiado las cosas)
Así rápido no veo esas otras UDF que comenta, sólo he visto cosas para multimonitor y tal, quizás en esas se pueda extraer el código que cambia la resolución pero función directa no he visto.

En fin, si encontráis algo mejor lo posteais aquí para que si alguien se encuentra con el mismo problema sepa qué usar.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por chekok »

Ximorro, como puedo controlar el tema multimonitor o donde has visto algo al respecto, gracias. Me sería de gran ayuda en mi nuevo proyecto.
La vida es larga y dura.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por Ximorro »

Pues este tiene buena pinta:
http://www.autoitscript.com/forum/topic ... 11-apr-21/

No lo he probado ni mirado mucho, me lo he encontrado buscando lo del cambio de resolución.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por BasicOs »

También puedes usar cualquier utilidad externa, que hay muchas, y arrancarla con Autoit, gestionando los parametros,
Salu22:)
cloferba
Mensajes: 15
Registrado: 10 Oct 2009, 16:21

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por cloferba »

BasicOs escribió:También puedes usar cualquier utilidad externa, que hay muchas, y arrancarla con Autoit, gestionando los parametros,
Salu22:)
es facil decirlo pero tengo puros hilos sueltos (no se a que utilidad externa te refieres..) , no he podido encontrar solucion a mi problema aun :S
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por BasicOs »

Yo he usado alguna utilidad de estas para algún programa porque tienen la lógica perfecta y solucionan esos detalles, te envio unos que busque en softonic:

http://www.entechtaiwan.com/
http://www.entechtaiwan.com/util/multires.shtm
MultiRes provides simple and effective control over display settings, for single and multiple monitors, and for single and multiple users. A robust command-line and scripting facility make it a favorite with home and network administrators alike.
y también,
http://resolution-changer.softonic.com/

Puede que estas son de pago pero puedes encontrar gratuitas sin problemas,
lo de command line es que envias una orden con el RUN() O SHELLEXEC()
Salu22:)
Esto lo puedes arrancar linea a linea ENVIANDO AL COMMAND/CMD con RUN() (o generando un batch) Que para algo está el CMD, para usarlo :smt023 :smt023
Ejemplo de uso
• Restoring previous display settings:

multires.exe /restore

MultiRes always stores current display settings prior to making any changes, so that they can be easily restored on demand. This faciliates batch file processing, where it is desireable to run a specific application at a specific color depth and/or resolution, and then restore normal display settings when the application is closed. In the example below, assume the system is normally run at 1024,768,16 but it is desireable to run Internet Explorer at 800,600,32.

Código: Seleccionar todo

: batch file
multires.exe /800,600,32
start /w iexplore.exe
multires.exe /restore
Salu22:)
cloferba
Mensajes: 15
Registrado: 10 Oct 2009, 16:21

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por cloferba »

le has dado en el clavo, no se me habia ocurrido utilizar un cmd...porque no queria tomarme la molestia de tener que distribuir 1 cmd + el ejecutable de autoit, tan solo para cambiar la resolucion :smt017
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambie resolucion pero al salir no vuelve la original

Mensaje por BasicOs »

No necesitas distribuirlo:
1.- puedes crearlo al vuelo y borrarlo cuando no lo necesites
2.- En este caso mejor puedes ejecutar las ordenes desde el autoit como si fueran funciones de autoit (practicamente), LINEA A LINEA, autoit ejecuta programas externos y otros cmds..

El ejecutable lo metes dentro del exe de autoit con FileInstall() y lo borras cuando acabes de usarlo :) o lo dejas en la carpeta que desees
Salu22:)
Responder