Página 1 de 1

cambie resolucion pero al salir no vuelve la original

Publicado: 27 Sep 2011, 19:17
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?

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 27 Sep 2011, 20:44
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:)

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 27 Sep 2011, 21:52
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)

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 00:23
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:)

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 00:25
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.

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 01:40
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

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 09:07
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.

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 09:41
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.

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 10:01
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.

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 28 Sep 2011, 14:40
por BasicOs
También puedes usar cualquier utilidad externa, que hay muchas, y arrancarla con Autoit, gestionando los parametros,
Salu22:)

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 29 Sep 2011, 03:06
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

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 29 Sep 2011, 03:41
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:)

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 29 Sep 2011, 05:14
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

Re: cambie resolucion pero al salir no vuelve la original

Publicado: 29 Sep 2011, 13:45
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:)