Solved

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

Posted on 2008-06-18
8
673 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
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 

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

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

828 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