Hook global para los Windows Messages?

Iniciado por Eleкtro, 31 Mayo 2013, 20:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

¿ Alguien sería tán amable de mostrarme un código para crear un Hook de bajo nivel GLOBAL (que funcione FUERA del Form) para manejar los mensajes de windows (En concreto WM_MOUSEWHEEL) ?

Esto he aprendido a hacerlo dentro del Form con la Interface "IMessageFilter", pero cuando lo intento hacer para que funcione fuera del form no hay manera, todo lo que consigo son un par de Fails!,

Me han explicado la manera de hacerlo global, se puede hacer importando la librería user32.dll (La función "SetWindowsHookEx") para crear un low-level hook para interceptar los mensajes de Windows, la teoría la tengo, pero no sé hacerlo, me trabo en el punto de intentar usar la función "SetWindowsHookEx" y crear el sub para interceptar los mensajes (if m.message = &HX then...), todo el código que encuentro es para C++/C#, y para lo poco que encuentro de VBNET, (que además tiene poco que ver con los mensajes que quiero interceptar) ni me entero, bastante dificil.

Lo que necesito es hacer algo como esto:

Pseudo-código:
Código (vbnet) [Seleccionar]
Dim mousewheel_up as boolean
Dim mousewheel_down as boolean

Sub that Overides the windows messages to set the mousewheel booleans

   If mousewheel_up then msgbox("MouseWheel up")
   If mousewheel_down then msgbox("MouseWheel down")

End sub


Pero como ya digo, fuera del form.

Un saludo.








Maurice_Lupin

Cuando intento usar funciones de la API en vb.net, siempre recurro a este sitio. Quizá lo haz visitado.

Sobre la función setWindowshookex, encontré esto:

http://www.pinvoke.net/default.aspx/user32.setwindowshookex
Un error se comete al equivocarse.

Eleкtro

@Maurice_Lupin

Gracias, ya no recordaba que hice esta pregunta xD

Al final ya lo conseguí, conseguí usar la API para capturar si la rueda que se mueve es la de arriba o la de abajo, lo que no conseguí era una vez capturado, reproducir ese movimiento del ratón fuera de la APP, es decir mover la rueda del ratón, así que lo dejé a medias.

Bueno,
un saludo!








Maurice_Lupin

Cuando requiero usar funciones de la API, lo que hago es buscar code en C/C++ y pasarlo a VB.NET guiandome con http://www.pinvoke.net

Incluso consegui el serial del USB.

Saludos y si puedes postea tu code para aprender.
Un error se comete al equivocarse.

kub0x

Cita de: Maurice_Lupin en 28 Junio 2013, 22:50 PM
Cuando requiero usar funciones de la API, lo que hago es buscar code en C/C++ y pasarlo a VB.NET guiandome con http://www.pinvoke.net

Yo hago exactamente lo mismo. Primero busco en MSDN implementaciones e info en C/C++ sobre las API a utilizar y después el equivalente en VB.NET (en mi caso) a través de Pinvoke. De esta manera comprendes mejor el funcionamiento y uso de éstas.

Recomiendo esta práctica :D

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


Eleкtro

Acabo de descubrir que para enviar un "scroll up/scroll down" se hace con la función SendInput: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx

Cita de: Maurice_Lupin en 28 Junio 2013, 22:50 PMsi puedes postea tu code para aprender.

Código (vbnet) [Seleccionar]
Public Class Form1

    Public Structure Point
        Public X As Integer
        Public Y As Integer
    End Structure

    Public Structure Msllhookstruct
        Public Location As Point
        Public MouseData As Integer
        Public Flags As Integer
        Public Time As Integer
        Public ExtraInfo As Integer
    End Structure

    Private Delegate Function HookProc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As Integer


    <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SetWindowsHookEx(ByVal hookType As Integer, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
    End Function

    <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As Msllhookstruct) As IntPtr
    End Function

    Public Hook As IntPtr

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Hook = SetWindowsHookEx(14, AddressOf Proc, Process.GetCurrentProcess().MainModule.BaseAddress.ToInt32(), 0)
    End Sub

    Private Function Proc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As IntPtr
        If wParam = 522 Then
            Dim Delta = CShort(lParam.MouseData >> 16)

            If Delta > 0 Then
                ' Up
                MsgBox("Up")
            ElseIf Delta < 0 Then
                ' Down
                MsgBox("Down")
            End If
        End If

        Return CallNextHookEx(Hook, nCode, wParam, lParam)
    End Function

End Class