Detectar cuando el ratón entra o sale de un control (Hook de mensajes)
Documentación de la DLL "dsflash.dll" (c) 2002 by J. Thuemmler, Delphin Software
Esta DLL es gratuita y no tiene garantía.
PROPÓSITO DE LA DLL
- Reconocer y señalizar cuándo el puntero del ratón entra en un control o lo abandona, manejando hasta 100 controles "reales", 100 controles "windowless" (sin propiedad hwnd) como label o image y hasta 50 zonas rectangulares.
- Seleccionar elementos de un listbox con sólo colocar el ratón sobre ellos.
Si quieres usar la DLL en aplicaciones MDI debes llamar a la función SetMDI() pasando el handle de la ventana MDI :
Private Sub MDIForm_Load()
Form1.Show
Form2.Show
Call SetMDI(hwnd)
End Sub
Para usar esta DLL puedes copiarla en el directorio de la aplicación o en el de sistema para uso compartido.
Se ha desarrollado el módilo "modFlash.bas" para reducir al mínimo el código de los formularios (ver ejemplo).
CÓMO FUNCIONA
La DLL sigue el movimiento del ratón empleando un hook del tipo WH_MOUSE y/o un timer interno. Cuando el hook realiza un cambio en la ventana en la que está el ratón la DLL llama a una función de tu aplicación, la cual debe estar en un módulo.
Los controles a "controlar" deben ser pasados a la DLL usando la función"AddObject()". También puedes emplear controles windowless como labels, shapes o images usando la función"AddRect()".
Puedes también definir un rectángulo y monitorizar eas "zonas" empleando la función "AddZone()". Las zonas no pueden ser más grandes que la ventana ni contener controles que estén también monitorizados. Esta característica es útil cuando quieres emplear una zona que contiene muchos controles.
La función debe tener el siguiente prototipo :
Public Function Callback&(ByVal cnew&, ByVal Item&)
La dirección de esta función debe ser pasada a la DLL en la llamada a "Prepare()" usando "AddressOf Callback".
Esta función será llamada por la DLL cuando el estado ha cambiado."cnew" contiene el elemento o 0 (cero) si el cursor está fuera de las regiones controladas.
Los controles windowless son pasados como números negativos, los controles "reales" por su hwnd y las zonas como un número secuencial positivo según se fueron añadiendo.
En los controles "reales" el parámetro "Item" será igual a -1; en los listbox "Item" contendrá el índice del elemento sobre el que está el cursor, contado para los elementos visibles, es decir, el primer elemento visible tendrá valor cero.
El valor de la propiedad ListIndex puede ser determinado empleando la propiedad TopIndex del listbox.
Normalmente, cuando existe más de un formulario en tu aplicación sólo se controlará el activo. Si quieres también controlar los inactivos debes llamar a la función "FlashAll(1)".
FUNCIONES
Prepare
Private Declare Function Prepare& Lib "dsflash" (ByVal ProcAddress&, ByVal UseHook&)
Parámetros :
ProcAddress : Dirección de la función callback.
UseHook : 0 para que la función reconozca el movimiento del ratón mediante un timer interno (sin hook) y 1 para que lo haga mediante un hook y un timer (la mjor manera).
Valor de retorno
1 (True), si todo fue bien, en otro caso 0 (false).
AddObject
Private Declare Function AddObject& Lib "dsflash" (ByVal hwnd&, ByVal hform&)
Parámetros :
hwnd : Handle del control (hwnd).
hform : Handle del formulario que contiene el control.
Valor de retorno
-1, si el handle es inválido o se han añadido más de 100 controles
-2, si el control ya se había pasado
Si todo va bien se devuelve un número asignado internamente por la DLL para identificar el control, que será necesario para eliminarlo.
AddRect
Private Declare Function AddRect& Lib "dsflash" (ByVal hcontainer&, ByVal hform&, _
ByVal Left&, ByVal Top&, ByVal Width&, ByVal Height&)
Parámetros:
hcontainer : Handle del contenedor del control.
hform : Handle del formlario en el que está el control.
Left, Top, Width, Height : Posición y tamaño en pixels del control windowless en coordenadas relativas a su contenedor.
Valor de retorno
0 (cero), si ya se añadieron más de 100 controles
Si todo va bien se devuelve un número utilizado por la DLL para identificar el control o ractángulo. Este número se requerirá para eliminar el control/rectángulo.
AddZone
Private Declare Function AddZone& Lib "dsflash" (rct As RECT, ByVal hform&)
Parámetros :
rct: Las coordenadas en píxeles relativas a hform.
hform : Handle de l ventana que contiene el rectángulo.
Valor de retorno
0 (cero), si se han añadido más de 50 zonas
Si todo va bien se devuelve un número utilizado por la DLL para identificar la zona. Este número será necesario para eliminar la zona.
FlashAll
Private Declare Function FlashAll& Lib "dsflash" (ByVal flash&)
Parámetros :
flash : Por defecto 0. Si es cero sólo se tendrá en cuenta la ventana activa. Si es mayor se tomarán todas las ventanas.
Valor de retorno
Siempre es 1 (true)
RemoveObject, RemoveRect y RemoveZone
Private Declare Function RemoveObject& Lib "dsflash" (ByVal Num&)
Private Declare Function RemoveRect& Lib "dsflash" (ByVal Num&)
Private Declare Function RemoveZone& Lib "dsflash" (ByVal Num&)
Parámetros :
Num : Número devuelto por "AddObject()", "AddRect()" o "AddZone()".
Valor de retorno
1 (true), si todo fue bien
0 (false), en caso contario.
SetUC
Private Declare Function SetUC& Lib "dsflash" (ByVal uc&)
Parámetros :
uc : uc = 1, cuando usas la DLL para usercontrol, pero no para formularios.
Valor de retorno
Siempre es 1 (true).
SetMDI
Private Declare Function SetMDI& Lib "dsflash" (ByVal hwndMDI&)
Parámetros :
hwndMDI : Handle del formulario MDI. Debes llamar a esta función para usar la DLL en aplicaciones MDI.
Valor de retorno
1 (true), si hwndMDI& es un handle válido, en otro caso 0 (false).
UnHook
Private Declare Function UnHook& Lib "dsflash" ()
Parámetros :
Esta función no tiene parámetros.
Valor de retorno
1 (true), si todo fue bien
0 (false), en otro caso
CÓMO USAR LA DLL
- Poner la dll en el directorio de la aplicación o en el de sistema, para uso compartido
- Añadir el módulo modFlash.bas al proyecto.
- En cada formulario que contenga controles o zonas a controlar, seguir los siguientes pasos :
- Añadir "Sub FlashEvents(...)" copiándolo del ejemplo (no es necesario ningún cambio)
- Añadir "Sub ProcessControls(...)":
Private Sub ProcessControls(ctl As Control, ByVal what%)
Select Case what
Case 1 'El cursor entra en el control
'...
'...
Case 2 'El cursor abandona el control
'...
'...
End Select
End Sub
- Añadir "Sub ProcessZones(...)":
Private Sub ProcessZones(zone&, ByVal what%)
Select Case what
Case 1 'El cursor entra en la zona
'...
'...
Case 2 'El cursor sale de la zona
'...
'...
End Select
End Sub
Si no existen zonas debes añadir el procedimiento de todas formas, pero dejando el cuerpo en blanco :
Private Sub ProcessZones(zone&, ByVal what%)
'
End Sub
- Añadir los controles a monitorizar llamando a las funciones :
AddForFlash control1, Me
AddForFlash control2, Me
AddForFlash control3, Me
'...
en cualquier parte del código (por ejemplo en el Form_Load).
- Escribir el código que determina qué hacer cuando el cursor entra/sale del control o zona en sus correspondientes procedimientos (ProcessControls() y ProcessZones()).
Tienes diferentes maneras de distinguir entre los controles dependiendo de la situación :
Select Case ctl
Case Text1:
Case Picture1:
End Select
Select Case ctl.Name
Case "Text1":
Case "Picture1":
End Select
o, en el caso de un array de controles:
Select Case ctl.Index
Case 0:
Case 1:
End Select
o usando "If..Then..End If" (ver el ejemplo).
Delphin Software
Mail: delphinsoft@gmx.de
Phone: 049 7251 18671
Fax: 049 7251 989773
Traducción libre por José Rubí
dsflash.zip
Trucos
Página de Visual Basic
Página principal
