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.
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:
- 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.
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
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.
Genial era justo lo que necesitaba, gracias.
Hola
Queria saber si este mismo codigo, se puede aplicar en Visual Basic 6.0, o es solo para Net?
@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.
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?
Alguien lo tiene en c #?
Gracias de Antemano!
hola, una consulta, saben de alguna clase o metodo para hacerlo en java?
muy genial tu blog, saludos
gracias Manuel, escribo poco pero intento que sea útil
saludos!
bookmarked!!, I really like your web site!