Ereignis bei bestimmter Mauszeiger-Position

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Fonsi.

    Ereignis bei bestimmter Mauszeiger-Position

    Moin,

    ich möchte bei einer bestimmten Mauszeiger-Position ein Ereignis ausführen lassen. Der Mauszeiger befindet sich dabei nicht im Formular selbst, da das Programm minimiert läuft.

    Die Position des Mauszeigers lässt sich ja z.B. über Cursor.Position oder über die Windows-API abfragen. Als quick & dirty-Lösung kam mir grad nur die Möglichkeit in den Sinn, mit nem Timer die Position des Mauszeigers dauernd abzufragen und bei bestimmten Koordinaten das Ereignis aufzurufen.

    Gibt es eine elegantere Möglichkeit?
    HI

    Du kannst alternativ einen globalen MouseHook mittels WinApi dazu verwenden.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frmHook
    2. 'Apis fürs HOOKEN:
    3. <System.Runtime.InteropServices.DllImport("kernel32.dll")> _
    4. Private Shared Function GetModuleHandle(ByVal moduleName As String) As IntPtr
    5. End Function
    6. <System.Runtime.InteropServices.DllImport("user32.dll")> _
    7. Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
    8. End Function
    9. <System.Runtime.InteropServices.DllImport("user32.dll")> _
    10. Public Shared Function UnhookWindowsHookEx(ByVal hhook As IntPtr) As Integer
    11. End Function
    12. <System.Runtime.InteropServices.DllImport("user32.dll")> _
    13. Private Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As UInteger, ByVal lParam As IntPtr) As IntPtr
    14. End Function
    15. 'Der Delegate
    16. Private Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As UInteger, ByVal lParam As IntPtr) As IntPtr
    17. Private hkProc As HookProc
    18. Private hook As IntPtr
    19. 'MSDN: Installs a hook procedure that monitors low-level mouse input events. For more information, see the LowLevelMouseProc hook procedure.
    20. Const WH_MOUSE_LL As Integer = 14
    21. Private Function LowLevelMouseProc(ByVal nCode As Integer, ByVal wParam As UInteger, ByVal lParam As IntPtr) As IntPtr
    22. Dim p As Point = Cursor.Position
    23. 'hier ist der Bereich wo die Mousebewegung ein Event erzeugen soll. Dieses muss nicht hier deklariert werden
    24. 'In meinem Beispiel wird ein Event gefeuert, sobald die Maus sich oben Links in der Ecke befindet
    25. '(In den oberen 100x100 Pixeln des Desktops
    26. Dim r As Rectangle = New Rectangle(0, 0, 100, 100)
    27. Dim mrect As Rectangle = New Rectangle(p.X, p.Y, 1, 1) 'Maus Rectangle
    28. 'prüfen ob die Maus innerhalb des Rectangles ist.
    29. If r.IntersectsWith(mrect) Then
    30. 'Maus ist im angebenen Berreich, tu was:
    31. RaiseEvent MouseIsThere(p) 'ich habe hier ein eigenes Event gestartet
    32. End If
    33. 'CallNextHookEx ist optional, wird aber empfohlen da sonst andere Hooks von zB anderen Anwendungen nicht mehr behandelt werden
    34. Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
    35. End Function
    36. 'Mein MausEvent
    37. Public Event MouseIsThere(ByVal p As Point)
    38. Private Sub Mouse_is_There(ByVal p As Point) Handles Me.MouseIsThere
    39. Debug.Print("Maus is in Punkt " & p.ToString) 'Ich lass mir mal die Koordinaten hier ausgeben.
    40. End Sub
    41. Private Sub Hookfrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    42. 'Ich habe den Hook im Formloadevent registriert.
    43. 'Delegat für den Hook erstellen
    44. hkProc = New HookProc(AddressOf LowLevelMouseProc)
    45. 'Hook Registrieren
    46. 'Parameter Siehe MSDN: WH_MOUSE_LL ist der globale LowLevelMouseHook, hkProc der Delegat der auf die Prozedur zeigt.
    47. 'GetModuleHandle(Nothing) gibt ein Handle auf den aufrufenden Prozess zurück. Das ist unsere .exe
    48. 'Diese Registriert den Hook.
    49. 'der letzte Parameter gibt an, welcher Thread mit dem Hook versehen wird
    50. 'Bei 0 werden alle Threads im selben Desktop des aufrufenden Threads genommen
    51. hook = SetWindowsHookEx(WH_MOUSE_LL, hkProc, GetModuleHandle(Nothing), 0)
    52. End Sub
    53. '//WICHTIG//
    54. 'Ressourcen des Hooks wieder freigeben durch UnhookWindowsHookEx
    55. 'Ich habe es in meinem Fall das HandleDestroyedEvent der Form überschrieben und dort mit durchgeführt.
    56. 'Musst du dir halt überlegen
    57. Protected Overrides Sub OnHandleDestroyed(ByVal e As EventArgs)
    58. UnhookWindowsHookEx(hook)
    59. MyBase.OnHandleDestroyed(e)
    60. End Sub
    61. End Class


    Das ist meine Signatur und sie wird wunderbar sein!