定时器和64位处理器,我很困惑

时间:2010-09-30 10:48:39

标签: vb.net visual-studio-2010

首先,我是visual basic的新手,我需要破解一个不断点击的应用程序(不要问)。

我的电脑上的一切都很好,花花公子,然后我编译,移动到最终目的地,我不工作!起初我以为这是一个操作系统问题,但两台机器都有win7,我认为这是一个编译问题,在另一台电脑上安装了visual studio,重新编译仍然没有运气,然后它就恍然大悟,可能是个问题32位对64位?

可悲的是,我对此知之甚少,所以我问你。

这段代码是这样的:

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的间隔为100,timeClicker的间隔为10,两者都在表单项目上声明(不在代码中)。 MainTimer工作得很好(我已经完成了测试),这是完全不起作用的timeClicker!

有人可以告诉我为什么并可能帮助我理解这个问题吗?

非常感谢

编辑:根据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

顺便说一句,这不是mouse_event的问题,是不起作用的计时器。

2 个答案:

答案 0 :(得分:3)

是的,这不能在32位机器上运行,它设法在64位机器上刮,但这纯粹是运气。你的pinvoke声明可以追溯到VB6时代,对VB.NET来说是完全错误的。注意这一点,那里有很多垃圾声明。 pinvoke.net网站是一个很好的选择,以使其正确。修正:

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)

你想在你的开发机器上做的另一件事就是你可以为32位机器调试它是Project + Properties,Compile选项卡,向下滚动,Advanced Compile Options,Target CPU = x86。也可以启用编辑+继续,你会喜欢它。

请注意,您的GetAsyncKeyState()声明几乎肯定也是错误的。它返回Short,而不是Integer。

答案 1 :(得分:0)

尝试以这种方式声明mouse_event:

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)

并以这种方式称呼它:

mouse_event(0, 0, 0, 0, IntPtr.Zero)