views:

37

answers:

2

First of all I'm a total newby in visual basic, I needed to hack an application that kept clicking (don't ask).

Everything is nice and dandy on my pc, then I compile, move it to its final destination and I doesn't work! At first I thought it was a OS problem, but both machines has win7, I then thought it was a compilation problem, installed visual studio on the other pc, recompiled still with no luck, then it dawned on me, may it be a problem of 32bit vs 64bit?

Sadly I don't have enough knowledge about it and so I ask you.

The piece of code is this:

Private Sub mainTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mainTimer.Tick

Dim keyStart As Boolean
keyStart = GetAsyncKeyState(Keys.A)
If keyStart = True Then
    timeClicker.Enabled = True
    timeClicker.Start()
End If

Dim keyStop As Boolean
keyStop = GetAsyncKeyState(Keys.S)
If keyStop = True Then
    timeClicker.Stop()
    timeClicker.Enabled = False

End If

End Sub

Private Sub timeClicker_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timeClicker.Tick
    mouse_event(mouseclickdown, 0, 0, 0, 0)
    mouse_event(mouseclickup, 0, 0, 0, 0)
End Sub

MainTimer has an interval of 100 and timeClicker has an interval of 10, both are declared on the form project (not in the code). The MainTimer works perfectly (I've done tests) it's the timeClicker that doesn't work at all!

Can somebody tell me why and possibly help me understand the issue?

Thank you very much

EDIT: as requested by max

Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cbuttons As Long, ByVal dwExtraInfo As Long)

Private Const mouseclickup = 4
Private Const mouseclickdown = 2

By the way is not a problem of mouse_event, is the timer that doesn't work.

A: 

Try to declare mouse_event this way:

Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cbuttons As Integer, ByVal dwExtraInfo As IntPtr)

And call it this way:

mouse_event(0, 0, 0, 0, IntPtr.Zero)
max
+1  A: 

Yes, this cannot work on a 32-bit machine, it manages to scrape by on a 64-bit machine but that's sheer luck. Your pinvoke declaration dates from the VB6 era, it is quite wrong for VB.NET. Watch out for this, there are a lot of junk declarations out there. The pinvoke.net site is a good bet to get it right. Fix:

Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Integer, ByVal dx As Integer, _
    ByVal dy As Integer, ByVal cbuttons As Integer, ByVal dwExtraInfo As IntPtr)

Another thing you want to do on your dev machine so you can debug this for a 32-bit machine is Project + Properties, Compile tab, scroll down, Advanced Compile Options, Target CPU = x86. Also enables Edit+Continue, you'll love it.

Note that your GetAsyncKeyState() declaration is almost certainly wrong as well. It returns Short, not Integer.

Hans Passant