Solved

How can I intercept a mouse click event for Win XP or Win Vista in VB.NET

Posted on 2008-06-18
8
639 Views
Last Modified: 2013-11-26
I am writing a windows service (non-forms based) that needs to intercept ANY mouse click made (anywhere) in Windows XP or Windows Vista (in C# or VB.NET).  I don't need the coordinates or anything like that, just need to know if either mouse button was clicked so that the service will intercept the click (without affecting any other program running) and play a "click" noise.
I'm not sure where to begin on this one (the Internet has tons of stuff on events WITHIN a forms program, but nothing outside).
Any ideas?
0
Comment
Question by:bd9000
  • 2
  • 2
  • 2
8 Comments
 
LVL 3

Expert Comment

by:BitRunner303
ID: 21816522
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 21816756
Pretty sure you won't be able to get the hooks to work from a SERVICE...
0
 
LVL 3

Expert Comment

by:BitRunner303
ID: 21816952
Oops my bad.

You could do it just as easily with a WinForms app with Opacity set to 0 and not shown in the taskbar.  I know the requestor said he didn't want it in a WinForms app but that may be the most plausible method since you'd have to be running on an interactive user.
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 

Author Comment

by:bd9000
ID: 21817789
Thanks for the links.  I think this is way out of my league understanding how to actually implement the class.
How would I go about it in just a windows form app (when the form is out of focus?)


0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
ID: 21817929
For WinForms you can do this:
(note that in VB.Net 2005, or above, the hook does NOT work in the IDE...run the executable itself from the bin folder)
Imports System.Runtime.InteropServices

Public Class Form1
 

    Private WithEvents llmh As New LowLevelMouseHook
 

    Private Sub llmh_LeftClick() Handles llmh.LeftClick

        Debug.Print("Left Click @ " & DateTime.Now.ToString)

    End Sub
 

    Private Class LowLevelMouseHook
 

        Private Const HC_ACTION As Integer = 0

        Private Const WH_MOUSE_LL As Integer = 14

        Private Const WM_LBUTTONDOWN As Integer = &H201
 

        Public Structure POINTAPI

            Public x As Int32

            Public y As Int32

        End Structure
 

        Public Structure MSLLHOOKSTRUCT

            Public pt As POINTAPI

            Public mouseData As Int32

            Public flags As Int32

            Public time As Int32

            Public dwExtraInfo As Int32

        End Structure
 

        Private Declare Function SetWindowsHookEx Lib "user32" _

            Alias "SetWindowsHookExA" ( _

            ByVal idHook As Integer, _

            ByVal lpfn As LowLevelMouseProcDelegate, _

            ByVal hmod As Integer, _

            ByVal dwThreadId As Integer) As Integer
 

        Private Declare Function CallNextHookEx Lib "user32" ( _

            ByVal hHook As Integer, _

            ByVal nCode As Integer, _

            ByVal wParam As Integer, _

            ByVal lParam As MSLLHOOKSTRUCT) As Integer
 

        Private Declare Function UnhookWindowsHookEx Lib "user32" ( _

            ByVal hHook As Integer) As Integer
 

        Private Delegate Function LowLevelMouseProcDelegate( _

            ByVal nCode As Integer, _

            ByVal wParam As Integer, _

            ByVal lParam As MSLLHOOKSTRUCT) As Integer
 

        Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" ( _

            ByRef lpPoint As POINTAPI) As Integer
 

        Private hhkLowLevelMouse As Integer

        Private mouseDelegate As LowLevelMouseProcDelegate
 

        Public Event LeftClick()
 

        Public Sub New()

            Hook()

        End Sub
 

        Public Sub Hook()

            ' remove existing hook if there is one

            If hhkLowLevelMouse <> 0 Then

                UnHook()

            End If
 

            ' make a new hook

            mouseDelegate = New LowLevelMouseProcDelegate(AddressOf Me.LowLevelMouseProc)

            hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, mouseDelegate, _

                Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)

        End Sub
 

        Public Sub UnHook()

            If hhkLowLevelMouse <> 0 Then

                UnhookWindowsHookEx(hhkLowLevelMouse)

            End If

            hhkLowLevelMouse = 0

        End Sub
 

        Private Function LowLevelMouseProc( _

            ByVal nCode As Integer, _

            ByVal wParam As Integer, _

            ByVal lParam As MSLLHOOKSTRUCT) As Integer
 

            If (nCode = HC_ACTION) Then

                Select Case wParam

                    Case WM_LBUTTONDOWN

                        RaiseEvent LeftClick()
 

                End Select

            End If
 

            Return CallNextHookEx(hhkLowLevelMouse, nCode, wParam, lParam)

        End Function
 

        Protected Overrides Sub Finalize()

            UnHook()

            MyBase.Finalize()

        End Sub
 

    End Class
 

End Class

Open in new window

0
 

Author Comment

by:bd9000
ID: 21951057
Sorry it's taking so long to reply - I haven't had time to try this code.
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Suggested Solutions

This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
This video discusses moving either the default database or any database to a new volume.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now