Parpadeo tipo msn VB.Net

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.

flash_window.gif

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: 

  1. cbSize = peso en bytes de la estructura.
  2. hwnd = handler de la ventana sobre la cual actuamos.
  3. dwFlags = opciones que definirán el comportamientos de la función.
  4. uCount = cantidad de parpadeos deseados.
  5. dwTimeout = frecuencia en milisegundos del parpadeo.
    Constantes utilizadas para el seteo del miembro dwFlags.

    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:
    1. FLASHW_STOP = Detiene el parpadeo. El sistema devuelve la ventana a su estado original.
    2. FLASHW_CAPTION = Hace que parpadee la barra de título ventana.
    3. FLASHW_TRAY = Hace que parpadee el botón de la barra de tareas de una ventana.
    4. 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.
    5. FLASHW_TIMER = Hace que parpadee continuamente hasta que se llame a la funcion con FLASHW_STOP.
    6. 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 …
      Dim FlashInfo As FLASHWINFO

      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.

      Dim FlashInfo As 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:
      1. Si dwTimeout es cero, la funcion utiliza la frecuencia establecida para el parpadeo del cursor en las opciones de teclado.
      2. 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:

      miguel dijo...

      Muy interesante. Pregunta: ¿esta solucion puede aplicarse a soluciones tipo Web?

      César Bravo Alvarado dijo...

      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