Visualización en pantalla

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Visualización en pantalla

Mensaje por joaquin »

Hola, A ver si pueden ayudarme a resolver estas dudas: :smt017

1.-Es posible crear una ventana GUICreate("",1280,20,-1,750,$WS_POPUP,$WS_EX_TRANSPARENT ), justo encima de la barra de tareas de Win, de forma que siempre quede en esa posición independientemente de la resolución o tamaño del monitor.
2.-Cómo se puede conseguir el efecto de "Apagar equipo" en Win (la pantalla queda en gris a excepción de la ventana que queda en color). Otros programas como el TuneUp también lo hacen cuando compacta el registro por ejemplo ...

Saludos
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Visualización en pantalla

Mensaje por Ximorro »

Es muy fácil mirando exáctamente dónde está la barra, en realidad mejor hacerlo así porque no sé si sabes que el usuario puede ponerla arriba, o incluso en los laterales.

Se me ocurre esta manera, pongo el resultado en un MsgBox pero simplemente puedes usar esos datos para crear tu GUI:

Código: Seleccionar todo

$PosTamBarra = WinGetPos("[Class:Shell_TrayWnd]")
MsgBox(0, "BARRA DE TAREAS DE WINDOWS", "Posición (X,Y): " & $PosTamBarra[0] & "," & $PosTamBarra[1] & @CRLF & _
		"Tamaño (ancho, alto): " & $PosTamBarra[2] & "," & $PosTamBarra[3])
Aunque la barra se oculte automáticamente (como en mi caso) te muestra el valor completo, si también quieres ocultar tu barra pues eso no sé cómo detectarlo.

Para que esté siempre encima tendrás que usar probablemente el estilo extendido $WS_EX_TOPMOST al crearla, o posteriormente con WinSetOnTop(). Quizás también se pueda quitar el flag topmost a la bandeja, puede que se deje (tamibén se hace con WinSetOnTop())

Lo del efecto que dices ya es más complicado y requeriría investigación, supongo que lo haría usando GDI+, capturando la ventana, haciendo un GUI sin barra de título ni borde que lo tape todo y pintando a mano en ese GUI la pantalla modificada pasada a grises... y el otro GUI encima... Esa es la idea, te recomiendo ir mirando los ejemplos con GDI+, que la cosa tiene su intríngulis.

A ver qué haces con ese programa no me seas malo.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Visualización en pantalla

Mensaje por joaquin »

Gracias Ximorro por tu solución, me parece ideal para poder ubicar la GUI, que era la duda que planteaba... No había considerado que la barra pudiera estar en otro lado de la pantalla....
A ver.... :smt005 explico un poco más, que igual hay algún tipo de confusión. Cuando plantee "justo encima", no me refería en el sentido de superpuesta a la barra de tareas, todo lo contrario, que no la tapara... La idea es crear un label que va mostrando un refran cada 10 segundos y me pareció que el sitio donde menos podia interferir era por encima de la barra de tareas (considerando que la barra está abajo, que suele ser lo más habitual). Bueno es una opción porque tambien se podria hacer con SplashText ,ToolTip. Enfin muestro el código y creo que quedará más claro... :smt002

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <IE.au3>
Opt("WinTitleMatchMode", 3)
Opt("GUICoordMode", 1)
Global $file, $hwnd , $nline, $tline
$file = FileOpen(@ScriptDir &"\refranes.txt", 0)
If $file = -1 Then
    MsgBox(0, "Error", "No se puede abrir el fichero.")
    Exit
EndIf
$hwnd = GUICreate("Refranes",1280,20,-1,750,$WS_POPUP )
GUISetBkColor(0xEEC900)
GUISetState()
$nline = Random (1, 10, 1)
$tline = FileReadLine($file,$nline)
While 1
	If $tline = "" Then
		$nline = 0
	EndIf
	$nline = $nline + 1
	$tline = FileReadLine($file,$nline)
	Sleep (10000)
	GUICtrlCreateLabel($tline, 40, 2, 1200,50,$SS_CENTER)
	GUICtrlSetFont( -1, 11, 600,2,"Trebuchet")
	WinSetOnTop("Refranes", "", 1)
Wend
FileClose($file)

...Preferiría que no mostrara la ventana en la barra de tareas mientra se ejecuta el script; sólo en el Tray.

Sobre la segunda pregunta,que en realidad no tiene que ver con la primera, jajajajaj, era pura curiosidad. Supongo que además de GDI, se debe hacer con alguna API, o algo similar. Debe haber alguna manera de controlar las propiedades de color, brillo, contraste del monitor.
Bien, muchas gracias por tu aportación...
:smt023
Saludos
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Visualización en pantalla

Mensaje por Chefito »

Las ideas de Ximorro son muy buenas :smt023 .
Piensa también que puedes interactuar con la barra de tareas de win como si fuese una ventana, y puedes añadirle botones, labes, etc. Puede que esto te interese para poner un label fijo con los refranes o algo así.

Y respecto a lo de poner la pantalla en gris cuando le das a apagar.....pienso exactamente lo que Ximorro. Debe ser una captura de pantalla que a la que tratan los colores, ya que si te das cuenta, cuando intentas darle a algún elemento no puedes. Es como si hubiese una imagen encima. También, si tienes un ordenador un tanto lento, cuando le das a cancelar, hace un efecto como si se quitase algo de encima del escritorio :smt001 .

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 ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Visualización en pantalla

Mensaje por Ximorro »

Además quieres tu ventana encima y esa no debe perder los colores... a ver cómo lo haces si estás quitando brillo al monitor.
De todas maneras lo de manejar esos ajustes del monitor lo veo difícil de forma general. Será factible de forma particular usando los drivers específicos, pero eso ya depende de lo que te ofrece cada uno.
Es algo más fácil probablemente atacando la tarjeta de video, pero entonces seguramente tendrás que ponerte en modo Direct3D o algo así.
Lo dicho, para lo que quieres lo más fácil es manipular una captura de la pantalla en un GUI TOPMOST, y que tu segundo GUI esté encima de este y no se vea afectado por esa manipulación de colores o brillos.

Me alegro de que sea este tipo de progama el que buscabas, es mucho mejor decir lo que se está haciendo porque así es más fácil dar la ayuda, ¡y mucho mejor si se pone código!
Estaba un poco preocupado por si estaba ayudando a alguna actuación delictiva ;-) , porque parecía que querías suplantar la barra de tareas, y simular un apagado aunque no lo fuera... ¿para dejar un ordenador abierto haciendo creer al usuario que no lo está?... malo malo

Sobre lo de que no aparezca en la barra de tareas, puedes hacerlo poniéndole el estilo extendido $WS_EX_TOOLWINDOW, esto es un poco especial porque además hace la barra de título más estrecha, y no pone icono. Pero eso en este caso te puede venir bien porque así tu GUI es más compacto y para lo que quieres probablemente queda mejor.

ciaooo
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Visualización en pantalla

Mensaje por joaquin »

@Chefito: Thanks por la sugerencia...

@Ximorro: ...justo lo que buscaba para no mostrar la ventana en la barra de tareas de Win, queda más estético.

Respecto a la pantalla, tu respuesta supera mis posibilidades...Era curiosidad suscitada a partir del "Apagar equipo", y de otros programas como el "Desfragmentador de registro de TuneUp", que focaliza en color la ventana de la aplicación y deja el resto en gris inhabilitando la pantalla y su funcionalidad, supongo que es por seguridad e integridad del sistema, ya que el usuario podría interferir con algún proceso mientras se analiza y reescribe la base del registro. Bueno, ese creo que sería un efecto más benévolo que el que habías hipotetizado... :smt005
Por otro lado, fíjate que la posicion de la GUI es a 750, que si le sumas que mide 20, más los 30 que mide la barra de tareas de win son los 800 de una pantalla 1280x800, por lo que ninguna ventana queda superpuesta.
Al final la distancia entre lo que uno quiere comunicar, lo que llega a expresar, lo que el otro entiende, y lo que se acaba interpretando con lo que se cree haber entendido pues puede ser enorme, ¿no?... Espero haber disipado cualquier preocupación suscitada , que para este caso y en el sentido que apuntabas, era innecesaria. :smt002
Gracias nuevamente por las aportaciones.

Saludos
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Visualización en pantalla

Mensaje por Ximorro »

Respecto a la pantalla (realmente eran dos consultas totalmente diferentes, casi podías haber puesto dos posts) se me ha ocurrido esta manera sin usar GDI+. Es lo que te decía de poner un GUI que lo tape todo, pero en vez de copiarle el escritorio y manipular la imagen, oscurezco lo de atrás a base de transparencias. A ver qué te parece:

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;Este GUI tapa toda la pantalla, no tiene barra de título ni borde, no aparece en la barra de tareas...
Global $GUI_fondo = GUICreate("Fondo", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOr($WS_EX_TOPMOST,$WS_EX_TOOLWINDOW))
GUISetBkColor(0)
WinSetTrans($GUI_fondo, "", 1)

;Este es el GUI normal
Global $GUI_frente = GUICreate("Mi ventana principal", 400, 160)
GUICtrlCreateLabel("Esta ventana queda resaltada en primer plano sin oscurecer", 75, 35, 250, 40, $SS_CENTER)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlCreateLabel("", 50, 20, 300, 70, $SS_ETCHEDFRAME)
Global $btnSalir = GUICtrlCreateButton("&Salir", 150, 110, 100, 30)

GUISetState(@SW_SHOW, $GUI_fondo)
GUISetState(@SW_DISABLE, $GUI_fondo) ;Para que no se venga al frente cuando pinchamos
GUISetState(@SW_SHOW, $GUI_frente)
WinSetOnTop($GUI_frente, "", 1) ;Enfrente de todo, incluso $GUI_fondo que es POPUP y TOPMOST

;Hacemos que el escritorio oscurezca a base de cambiar la transparencia de $GUI_fondo
For $i = 0 To 150 Step 5
	WinSetTrans($GUI_fondo, "", $i)
	Sleep(25)
Next

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $btnSalir
			Exit
	EndSwitch
Wend
Hago que oscurezca pues el fondo es negro (cambiado con GUISetBkColor). Puedes hacer que aclare poniéndolo blanco, o que se tiña de otro color poniendo ahí lo que quieras.

Saludosssss
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Visualización en pantalla

Mensaje por joaquin »

Una solución genial Ximorro!!! :smt038
Has conseguido un efecto muy logrado, y creo que el resultado es mejor incluso que la propuesta inicial ya que se puede escoger el tono para el fondo, preserva los colores del escritorio o la ventana que haya y en lugar de ser una captura, es "real", ya que por ejemplo la hora se actualiza, cosa que en la captura no. Por lo demás tiene la misma funcionalidad: focalizar la atención y la interacción con la ventana de la aplicación.
Además el código queda bastante simplificado y no me parece tan forzado como el método de capturar y manipular la imagen. En fin, muy ingenioso como resuelves con WinSetTrans!


:smt023 Saludos
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Visualización en pantalla

Mensaje por Chefito »

Sí, jejejeje....es una forma muy ingeniosa y chula de simular el efecto :smt023 .
Enhorabuena Ximorro :smt002 .
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 ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Visualización en pantalla

Mensaje por Ximorro »

Gracias, me alegro de que os haya gustado. :smt020

Lo mejor es que es una solución simple pero efectiva, esas son las mejores, sin complicaciones. ;-)

saludos
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder