Muchas veces me pregunté como es que se hace para que las ventanas del msn (que normalmente están minimizadas) empiecen a parpadear (lo que se considera una alerta).
Buscando un poco por internet, me encontré con una web que lo explicaba.
Aquí el código:
Este efecto es, por ejemplo, el que vemos cuando alguien nos escribe en una conversación de Messenger que tenemos minimizada.
El Net Framework no nos provee un método para lograr dicho efecto por ende la alternativa obligada es recurrir a la API de Windows. El nombre de nuestra función es FlashWindowEx alojada en User32.dll y su utilización es de lo más sencilla. La declaración a incluir es:
<DllImport(“user32.dll”)> _
Public Shared Function FlashWindowEx(ByRef pfwi As FLASHWINFO) As Integer
End Function
Y para su invocación solo se debemos completar la siguiente estructura que será pasada como parámetro:
<StructLayout(LayoutKind.Sequential)> _
Structure FLASHWINFO
Dim cbSize As Integer
Dim hwnd As System.IntPtr
Dim dwFlags As Integer
Dim uCount As Integer
Dim dwTimeout As Integer
End Structure
Miembros de la estructura FLASHWINFO:
- cbSize = peso en bytes de la estructura.
- hwnd = handler de la ventana sobre la cual actuamos.
- dwFlags = opciones que definirán el comportamientos de la función.
- uCount = cantidad de parpadeos deseados.
- dwTimeout = frecuencia en milisegundos del parpadeo.
Private Const FLASHW_STOP As Integer = &H0
Private Const FLASHW_CAPTION As Integer = &H1
Private Const FLASHW_TRAY As Integer = &H2
Private Const FLASHW_ALL As Integer = (FLASHW_CAPTION Or FLASHW_TRAY)
Private Const FLASHW_TIMER As Integer = &H4
Private Const FLASHW_TIMERNOFG As Integer = &HC
Significado de cada una de las constantes:
- FLASHW_STOP = Detiene el parpadeo. El sistema devuelve la ventana a su estado original.
- FLASHW_CAPTION = Hace que parpadee la barra de título ventana.
- FLASHW_TRAY = Hace que parpadee el botón de la barra de tareas de una ventana.
- FLASHW_ALL = Suma lógica de las dos anteriores, con lo cual hace que parpadeen la barra de titulo y el botón de la barra de tareas de una ventana.
- FLASHW_TIMER = Hace que parpadee continuamente hasta que se llame a la funcion con FLASHW_STOP.
- FLASHW_TIMERNOFG = Hace que parpadee continuamente hasta que la ventana tome el foco.
Ahora si queremos hacer que el caption de nuestra ventana comience a parpadear …
With FlashInfo
.cbSize = Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO)))
.dwFlags = CType(FLASHW_ALL Or FLASHW_TIMER, Int32)
.hwnd = Me.Handle
.dwTimeout = 0
.uCount = 0
End With
FlashWindowEx(FlashInfo)
Cuando queramos que deje de parpadear no tenemos mas que llamar a FlashWindowEx seteando previamente el flag FLASHW_STOP en la estructura FLASHWINFO.
With FlashInfo
.cbSize = Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO)))
.dwFlags = CType(FLASHW_STOP, Int32)
.hwnd = Me.Handle
.dwTimeout = 0
.uCount = 0
End With
FlashWindowEx(FlashInfo)
Ultimas consideraciones:
- Si dwTimeout es cero, la funcion utiliza la frecuencia establecida para el parpadeo del cursor en las opciones de teclado.
- Al utilizar el flag FLASHW_TIMERNOFG no es necesario llamar con FLASHW_STOP para detenerlo, basta con enfocar la ventana.
Fuente:
http://puntobit.wordpress.com/2007/12/01/parpadeo-del-titulo-de-ventana-en-vbnet-flashwindowex/
Nota:
Si deseas un poco más de información, también puedes visitar esta web
http://geeks.ms/blogs/lmblanco/archive/2008/04/02/ventanas-parpadeantes-con-flashwindowex-y-ii.aspx
2 comentarios:
Muy interesante. Pregunta: ¿esta solucion puede aplicarse a soluciones tipo Web?
Pues nunca me he puesto a averiguar, aunque realmente no creo q sea posible ya que el parpadeo es controlado por el SO. Imagino que si trabajas con C# o VB y puedes importar las librerías que se usan en este ejemplo podrías hacerlo desde el codeBehind.
Te prometo averiguarlo
Publicar un comentario