Página 1 de 1

Cortina de pantalla (Pantalla de un sólo color)

Publicado: 02 Abr 2012, 22:00
por Jonny
Quiero hacer una función que haga lo que llamaría "cortina de pantalla". Esto no sería más que hacer que toda la pantalla fuera negra (por ejemplo) o de cualquier otro color, de forma que no se viera lo que hay realmente en ella. Imagino que esto se hace poniendo cada píxel de la pantalla a un mismo color, pero ¿como hago eso?. Y además se me ocurre que eso podría ser un poco lento ¿Que os parece?.

De paso, si pudiera hacerse con algo de efecto visual, como si realmente se corriese una cortina sobre la pantalla... ;) quedaría muy bien la función.

Además, quizá lo más complicado (al menos se me ocurre menos que lo anterior, el como hacerlo): Necesitaría otra función, para quitar esa "cortina", y que la pantalla se viese normalmente, con todo lo que hubiera en ella, pero no tal como se quedó en el momento de borrar la pantalla con la "cortina", si no, con los elementos que debiera contener en ese momento.

Por ejemplo, si al ejecutar la función HideScreen() estaba enfocada esta página ;) y en el momento de ejecutar la función showScreen() lo que hay enfocado es el bloc de notas, que se viera ese cambio...

A ver si a alguien se le ocurre como hacer esto, sobre todo lo segundo :).

Salu2!

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 01:17
por Chefito
Podrías crear una ventana sin marco (sin barra de título ni nada) de color negro, que estuviese arriba de todas para tapar todo (ejemplo propiedad $WS_EX_TOPMOST). Tendría que tener la resolución de la pantalla y hacer que aparezca de un lado a otro moviendo ésta.
No parece dificil.

Saludos.

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 06:38
por Jonny
Gracias por la respuesta.

Algo parecido se me ocurría hace un rato, pensando en las respuestas que podríais darme, pero me preguntaba, si al hacer algo con el ratón o el teclado, o incluso al ocurrir algún evento de Windows sin intervención, no se vería como se superponen otras ventanas encima de esta...

Podría hacerse que esta ventana que dices se superponga constantemente a las demás, pero no se si se notaría...

Salu2!

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 08:33
por Ximorro
Mira a ver si te da ideas este efecto que puse en este comentario:
http://www.emesn.com/autoitforum/viewto ... ecer#p7868

Vaya, es básicamente lo que necesitas, y es más o menos el tipo de ventana que te describe Chefito. En ese caso yo oscurecía el fondo (todo el escritorio y las ventanas que ya hubiera) para poner un GUI de alta prioridad delante y que sólo se pudiera interactuar con él.

Con algo así lo puedes hacer, tu cortina sería como mi "GUI oscurecedor" sólo que para la animación en vez de ir cambiando la cantidad de transparencia sólo tienes que desplazar el GUI de arriba a abajo (o como quieras) para que haga efecto cortina. Además si en vez de negro total pones la semitransparencia como en el ejemplo puede que también quede bien.
Para mover el GUI lo puedes hacer con WinMove()

Como ves se consigue un efecto muy interesante con un código bastante corto, y si no tienes que poner ventanas delante queda supersimple pues no hay que gestionar varias ventanas topmost a la vez. Pero bueno, si quieres poner ventanas delante de la cortina ya lo tienes en mi ejemplo.

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 11:18
por Jonny
En cuanto este en el pg le hecho un vistazo.

No lo dije, pero con la cortina activa, debería poderse usar el pc normalmente. Vaya, con cualquier otra ventana.
De hecho, no quería que se interactuara con la cortina, por eso en parte se me ocurrió hacerlo dibujando los pixeles.


Salu2!

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 12:13
por Ximorro
¿Por qué quieres hacer cosas a ciegas?

Se me ocurre una manera super fácil y efectiva, exactamente lo que quieres (excepto el efecto animación, sería ponerlo negro de golpe).
¿Qué tal apagando y encendiendo el monitor? :smt003 :smt003 :smt003

Ejem, eso de interactuar con lo que hay abajo no estaba en el post inicial...
Igual se puede montar un GUI que no responda a eventos, o más bien, que envíe los eventos a la ventana que tenga detrás. Ve haciendo código y nos muestras...

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 03 Abr 2012, 14:00
por Jonny
Sorry, no esperaba estar en el "pg" para ver el post de Ximorro, sino en el pc ;).

Sí, disculpa, porque no dije en el primer post que quería que se pudiera usar el ordenador con la cortina de pantalla activa.

No se trata de ponerse a navegar por internet, o configurar el sistema a ciegas ;), pero por ejemplo, que pudiera escribirse en un edit, que no estuviese en la ventana que actúa como cortina. Por ejemplo, para desactivar esta mediante contraseña.
Podría invocarse esta GUI con el edit, con un hotkey (ya que no habría forma de hacerlo normalmente sin ver la pantalla) :), pero siempre sin verse la ventana ni el edit; ya que se podría poner el foco automáticamente en el edit, listo para escribir...

Apagar la pantalla es otra opción, pero por eso de hacer el efecto, y porque en realidad quería las dos opciones (vi que la pantalla se apaga con alguna api de Windows pero no lo he probado aún), quería hacerlo así.

Voy a ver si miro el post que me decías, y a ver si estos días de fiesta me da por ponerme a ello.

Por cierto, si la ventana que actúa como cortina es de ancho y alto como la pantalla (la ocupa entera), para moverla por ejemplo, de izquierda a derecha ¿dónde la situaría? Porque habrá que darle una posición. ¿Funcionará dándole coordenadas negativas, para ir desplazándola hacia la derecha?.

Ah, me has dado una idea Ximorro:

Pues se me ocurre, que para hacerlo así de fácil, apagando la pantalla, y sin perder el efecto, podría crearse una ventana del tamaño del monitor, desplazarla como una cortina, y una vez estuviera toda la pantalla en negro apagar el monitor...
¿Se notaría?...

Para quitar la cortina, hacer lo contrario: poner la ventana en negro que ocupe toda la pantalla (de golpe), encender el monitor y desplazar esa ventana dejando a la vista lo que haya detrás...

Supongo que eso evitaría muchos problemas con esa GUI. Lo único es, que no podría ser de otro color, más que negro ;).

Por cierto, eso de que la GUI que hace de cortina envíe los eventos a lo que tenga detrás me ha gustado pero ¿como lo harías?. Porque por una parte, habría que saber que ventanas hay detrás, que eso no creo que fuera problema y por otra parte,habría que saber que eventos enviarle a qué ventana. Además, si mal no recuerdo, hay algunos eventos que no se capturan bien con AutoIt ¿no?. Claro que quizá con Apis...

Salu2!

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 04 Abr 2012, 08:06
por Ximorro
Jonny escribió:Sorry, no esperaba estar en el "pg" para ver el post de Ximorro, sino en el pc ;).
No tenía ni idea de lo que estabas hablando, suponía que era alguna abreviatura de jovencito que no pillo ;-)

Normalmente es mejor decir también para qué es la consulta que hacéis, porque así se pueden buscar otras soluciones para lo mismo y que quizás sean más sencillas.
Lo de poner una cortina y que se interactúe con lo de atrás no lo veo nada fácil, pero si lo que quieres es por ejemplo escribir en un edit para que no se vea lo que se escribe hay otras soluciones bastantes más fáciles.

Por ejemplo puedes usar la función InputBox(), que es una ventana con un edit donde puedes especificar que no se vean los caracteres, y poner asteriscos, bolitas o lo que quieras, vaya, que se puede usar como el típico diálogo de pedir contraseña.

Para hacer cosas más complejas que lo que te permita ese GUI pre-programado puedes hacer el tuyo específico y mandarlo fuera de pantalla para que no se vea, aún así le puedes dar foco por código con lo que escribiría en un edit de ese GUI que no se vé.

También se puede poner un Edit tapado por un Label y darle foco por código (o mejor, cuando se clique el label).
¡Mira si hay posibilidades infinitamente más sencillas que lo de la cortina!

Y quizás a alguien se le ocurra más posibilidades, pero desde luego más fácil que operar detrás de un GUI, porque por ahora lo único que se me ocurre es que capture los eventos del ratón y lo pase a lo que hay detrás...
Los eventos son "sólo" los clicks y la posición del ratón: $GUI_EVENT_MOUSEMOVE, $GUI_EVENT_PRIMARYDOWN, $GUI_EVENT_PRIMARYUP,
$GUI_EVENT_SECONDARYDOWN y $GUI_EVENT_SECONDARYUP
.
Además tendrías que asegurarte de perder enseguida el foco para que tu GUI no capture teclas, y veo cosas complicadas como pasar el MOUSEMOVE para que los controles de atrás reaccionen a eventos de hovering (por ejemplo cuando pones el ratón encima de un botón, que cambia de color aunque no lo cliques).
Sí, eso suena bastante más complicado, si lo que quieres es actuar en un control oculto hay maneras mucho más fáciles.


Lo de apagar la pantalla era una broma, yo no hablaba de APIs ¡sino de darle al botón! ;-) Me hizo gracia porque es justo lo que quieres: pantalla en negro y poder interactuar con las ventanas como si estuvieran ahí, ¡la solución más fácil y CERO líneas de código! ja, ja.

Juraría que sí puedes dar coordenadas negativas a una ventana. También puedes ponerla en 0,0 y cambiarle el tamaño, como no tiene contenido que todo es fondo el resultado será el mismo (sería buena idea probar las dos cosas a ver si alguna parpadea menos, consume menos recursos, etc)

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 04 Abr 2012, 19:20
por BasicOs
aqui para desconectar la pantalla:
http://www.autoitscript.com/forum/topic ... entry77394

Código: Seleccionar todo

Opt("WinTitleMatchMode', 4)

$WM_SYSCommand = 274
$SC_MonitorPower = 61808
$Power_On = -1
$Power_Off = 2
$X = 1

$HWND = WinGetHandle("classname=Progman")

While 1
   If $X = 1 Then
      $X = 0
      DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND, "int", $WM_SYSCommand, "int", _
      $SC_MonitorPower, "int", $Power_Off)
   Else
      $X = 1
      DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND, "int", $WM_SYSCommand, "int", _
      $SC_MonitorPower, "int", $Power_On)
   EndIf
   Sleep(10000)
WEnd
http://www.autoitscript.com/forum/topic ... f-example/

Código: Seleccionar todo

#NoTrayIcon

Global Const $lciWM_SYSCommand = 274
Global Const $lciSC_MonitorPower = 61808
Global Const $lciPower_Off = 2
Global Const $lciPower_On = -1

Global $MonitorIsOff = False

HotKeySet("{F11}", "_Monitor_OFF")
HotKeySet("{F10}", "_Monitor_ON")
HotKeySet("{Esc}", "_Quit")

MsgBox(64, "Monitor On/Off", "Press F11 to turn off the monitor." & @LF & _
                            "Press F10 to turn on the monitor back." & @LF & _
                            "Press ESC to turn on the monitor and exit program.")

While 1
    Sleep(10)
WEnd

Func _Monitor_ON()
    $MonitorIsOff = False
    Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')
    
    DllCall('user32.dll', 'int', 'SendMessage', _
                                                'hwnd', $Progman_hwnd, _
                                                'int', $lciWM_SYSCommand, _
                                                'int', $lciSC_MonitorPower, _
                                                'int', $lciPower_On)
EndFunc

Func _Monitor_OFF()
    $MonitorIsOff = True
    Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')
    
    While $MonitorIsOff = True
        DllCall('user32.dll', 'int', 'SendMessage', _
                                                    'hwnd', $Progman_hwnd, _
                                                    'int', $lciWM_SYSCommand, _
                                                    'int', $lciSC_MonitorPower, _
                                                    'int', $lciPower_Off)
        _IdleWaitCommit(0)
        Sleep(20)
    WEnd
EndFunc

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(60)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func _Quit()
    _Monitor_ON()
    Exit
EndFunc

Re: Cortina de pantalla (Pantalla de un sólo color)

Publicado: 05 Abr 2012, 08:00
por Ximorro
¡Al final mi broma sobre apagar el monitor se va a convertir en una opción seria! ;-)