PuntoBit

Diciembre 1, 2007

Parpadeo del título de ventana en VB.Net (FlashWindowEx)

Archivado en: API, Desarrollo, VB.Net — Etiquetas:, , , , , , , , , , — A l e x a n d e r @ 11:32 pm

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:

  • 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.

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:

  • 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 …

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.

5 comentarios »

  1. Hola!

    Habria alguna forma de traducir éste codigo de VB a C#???

    No se como utilizar la dll en el lenguaje de C#.

    Muchas gracias

    comentario por Jorge — Febrero 26, 2008 @ 11:43 am

  2. Hola
    Voy a intentar traducirlo a C# en los próximos días y edito el post con el código.

    Gracias por el comentario.

    comentario por A l e x a n d e r — Febrero 27, 2008 @ 8:43 am

  3. Genial era justo lo que necesitaba, gracias.

    comentario por SauLH. — Agosto 5, 2009 @ 1:09 pm

  4. Hola

    Queria saber si este mismo codigo, se puede aplicar en Visual Basic 6.0, o es solo para Net?

    comentario por Santiago — Octubre 17, 2009 @ 3:35 pm

    • @Santiago:
      Este codigo es exclusivamente para la plataforma NET pero en Visual Basic 6 es posible acceder a la API Win32 con mucha facilidad.
      No lo he intentado, pero si modificaras adecuadamente la sintaxis podrías hacer la llamada desde VB6 sin problemas.

      Quizas lo mas relevante de este post sea el analisis del comportamiento de los flags de la funcion.

      Si necesitas ayuda vuelve a escribirme.

      Saludos.

      comentario por A l e x a n d e r — Octubre 18, 2009 @ 11:02 am


Canal RSS de los comentarios de la entrada. URI para TrackBack.

Deja un comentario

Blog de WordPress.com.