[AYUDA] Mouse Hook

Iniciado por ignorantev1.1, 21 Marzo 2013, 21:53 PM

0 Miembros y 5 Visitantes están viendo este tema.

x64core

Cita de: ignorantev1.1 en 26 Marzo 2013, 07:05 AM
Misma burra, nomás que revolcada:

Voy a finalizar la aplicación (la que pone los hooks), antes de que finalice doy por terminado el hook del mouse:

Código (vb) [Seleccionar]
UnhookWindowsHookEx(msHook)

Después que "finaliza" la aplicación, la función que procesa el hook sigue funcionando lo cual provoca que se "frezee" Windows (hasta no cerrar el IDE de visual basic) o se cierra el IDE por si sólo. (porque no es todavía una aplicación, lo estoy corriendo del IDE). Para probar "mi teoría" puse "debug.print "Hola, sigo funcionando aún despues de hacer unhook ;)", y sí, el mensaje sigue apareciendo aún después de detener el programa:

¿Saben de alguna forma de terminar con el hook o manejarlo de tal manera que no suceda ésto?

Perdonen, saludos y gracias.

En que procedimiento remueves el hook? Y de que forma estas terminando?
Asegurate que esta pasando sobre la funcion que remueve el hook y el retorno de la función. Si estas en presionando el boton parar del IDE, ese es el problema.

ignorantev1.1

La app tiene un procedimiento para terminar los hooks y es llamado al finalizar la aplicación (ojo: finalizar, no parar el programa en el  IDE). En ese procedimiento:

Código (vb) [Seleccionar]

funcion finalizarApp()
...
call UnhookWindowsHookEx(msHook)
hooks = false 'Esta bandera la utilizo para saber el estado de los hooks.
...


Con la bandera "hooks" me aseguro que se haya pasado por el procedimiento que remueve los hooks. En la función que recibe al hook:

Código (vb) [Seleccionar]

Public Function MSProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long

    if not hooks then  debug.print "Hola, sigo funcionando después de hacer unhook, ¿te jode?"

    If nCode = 0 Then
        'TODO
    Else
        If hooks Then msHook = CallNextHookEx(msHook, nCode, wParam, lParam)
    End If
End Function


No recuerdo porque hice de esta forma la función, y no entiendo bien el para qué de "CallNextHookEx"...

Saludos y gracias.

x64core

Cita de: ignorantev1.1 en 26 Marzo 2013, 16:32 PM
La app tiene un procedimiento para terminar los hooks y es llamado al finalizar la aplicación (ojo: finalizar, no parar el programa en el  IDE). En ese procedimiento:

Código (vb) [Seleccionar]

funcion finalizarApp()
...
call UnhookWindowsHookEx(msHook)
hooks = false 'Esta bandera la utilizo para saber el estado de los hooks.
...


Con la bandera "hooks" me aseguro que se haya pasado por el procedimiento que remueve los hooks. En la función que recibe al hook:

Código (vb) [Seleccionar]

Public Function MSProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long

    if not hooks then  debug.print "Hola, sigo funcionando después de hacer unhook, ¿te jode?"

    If nCode = 0 Then
        'TODO
    Else
        If hooks Then msHook = CallNextHookEx(msHook, nCode, wParam, lParam)
    End If
End Function


No recuerdo porque hice de esta forma la función, y no entiendo bien el para qué de "CallNextHookEx"...

Saludos y gracias.

Yo no tengo ningun problema, Iniciar:
hook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseMonitorWinProc, App.hInstance, 0&)

Remover:
call UnhookWindowsHookEx(hook)

De lo contrario verifica el valor de UnHookWindowsHookEx y el ultimo error.