Inicio > API, Desarrollo, Visual Basic .NET, WinForm > Parpadeo del título de ventana en VB.Net (FlashWindowEx)

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

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.
  1. Jorge
    febrero 26, 2008 a las 11:43 am

    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

  2. A l e x a n d e r
    febrero 27, 2008 a las 8:43 am

    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.

  3. SauLH.
    agosto 5, 2009 a las 1:09 pm

    Genial era justo lo que necesitaba, gracias.

  4. Santiago
    octubre 17, 2009 a las 3:35 pm

    Hola

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

    • A l e x a n d e r
      octubre 18, 2009 a las 11:02 am

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

  5. diciembre 17, 2009 a las 12:33 pm

    Hola estoy tratando de hacer que una ventanda parpadee tal y como en el messenger y entonctre tu codigo, soy algo nueva en esto, pero tengo un problema no me reconoce las instrucciones que abajo coloco:

    .cbSize = Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO)))
    Me indica que «Marshal» no ha sido declarada

    .hwnd = Me.Handle
    Me indica que Handle no es un miembro de mi forma.

    Estoy trabajando en VB Studio 2005 y proyecto ajax! Me puedes ayudar?

    Debo agregar aldo mas a mi codigo?

  6. Fx!
    diciembre 7, 2011 a las 8:17 pm

    Alguien lo tiene en c #?
    Gracias de Antemano!

  7. Jorge
    diciembre 10, 2011 a las 10:10 pm

    hola, una consulta, saben de alguna clase o metodo para hacerlo en java?

  8. Manuel
    junio 8, 2012 a las 7:52 pm

    muy genial tu blog, saludos

    • A l e x a n d e r
      junio 10, 2012 a las 11:52 pm

      gracias Manuel, escribo poco pero intento que sea útil
      saludos!

  9. noviembre 13, 2019 a las 12:48 am

    bookmarked!!, I really like your web site!

  1. No trackbacks yet.

Deja un comentario