关于mouse_Event和SetCursorPos模拟鼠标移动的奇怪问题

时间:2023-01-01 00:18:18
真奇怪,我在VB9.0中使用mouse_Event模拟鼠标移动时,如mouse_event(MOUSEEVENTF_MOVE, 100, 200, 0, 0),发现鼠标实际上只能在Y方向移动,X方向始终不移动,停留在当前的x坐标处,而且,在Y方向移动的值是100,而非200,经改变dx,dy的值多次调试,实际上dx有效,但体现的是屏幕Y方向的移动量,dy根本无效,始终为0。
于是我改用SetCursorPos(x,y)来模拟鼠标移动,但其实际效果是x值有效,Y值始终为0,也就是鼠标只能在屏幕顶作水平移动,这太奇怪了,我搜索了许多关于两函数的使用的贴子,均未发现有类似问题。请高手指点,到底是什么原因,谢谢!

11 个解决方案

#1


帮顶~

#2


没遇上过,按楼主的说法试验,一切正常
Public Class Form1
    Private Declare Function SetCursorPos Lib "User32" (ByVal x As Integer, ByVal y As Integer) As Boolean
    Private intX As Integer = 0
    Private intY As Integer = 0

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SetCursorPos(100, 100)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        intY += 10
        intX += 10
        SetCursorPos(intX, intY)
    End Sub
End Class

#3


我将你的程序粘贴后运行,同样存在上面的问题,真搞不懂!我用的是VB2008,你用的什么?难道是VB2008的Bug吗?

#4


真库恼!我现在正在编利用蓝牙PPC手机作蓝牙鼠标的应用程序,万事具备,只欠东风!就是这个问题困扰着我,真希望哪位DX指点一下.

#5


果然与VB版本有关,VB2005,VB2008均存在上述问题,可VB6就没问题,我只好用VB6生成一个DLL文件,在VB2008中进行引用,问题才得以解决,不过在没装VB6软件的电脑上,需要将DLL文件打包安装后,才能使用.请问你们用什么版本,有问题吗?

#6


我也是这样,我用的是vb2005。
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long
SetCursorPos(500, 111)
生成时也不会报错,x轴可以移动到500,但是y轴始终就是0。(用GetCursorPos测试过)




至于楼主说的mouse_event(MOUSEEVENTF_MOVE, 100, 200, 0, 0),这个我试过,x轴动不了,y轴可动,不过我用GetCursorPos测试时,y轴才到5,我的分辨率1024*768,个人感觉mouse_event的移动因该不是按分辨率来的。

#7


楼主,我用的就是vb2005,可是的确没有这个问题。。怀疑是其他原因造成的。

#8


引用 5 楼 hyallinone 的回复:
果然与VB版本有关,VB2005,VB2008均存在上述问题,可VB6就没问题,我只好用VB6生成一个DLL文件,在VB2008中进行引用,问题才得以解决,不过在没装VB6软件的电脑上,需要将DLL文件打包安装后,才能使用.请问你们用什么版本,有问题吗?

请问下,还有其他的解决方案吗?

#9


vb2005解决了,原来问题出现在这边。
Declare Function SetCursorPos Lib "user32" (ByVal X  As Long, ByVal Y  As Long)  As Long
Declare Function SetCursorPos Lib "user32" (ByVal x  As Integer, ByVal y  As IntegerAs Boolean
看来vb爱好者乐园里面的api手册有点问题。多谢cauhorse的指点。

#10


其实实现Mouse move可不用API,.net里有现成的函数:Cursor.Position=P 和p=Cursor.Position分别表示设置mouse位置和获取mouse位置,p as point (p.x,p.y)

#11


真是Long 和 integer的差别引起的,将Long 全部换成integer,问题得以解决,同样适用mouse_event函数,可能是32位和64位的原因吧,以后在引用API函数时可能均存在此问题,估计将Long 全部换成integer就成。Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
也存在类似问题。

#1


帮顶~

#2


没遇上过,按楼主的说法试验,一切正常
Public Class Form1
    Private Declare Function SetCursorPos Lib "User32" (ByVal x As Integer, ByVal y As Integer) As Boolean
    Private intX As Integer = 0
    Private intY As Integer = 0

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SetCursorPos(100, 100)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        intY += 10
        intX += 10
        SetCursorPos(intX, intY)
    End Sub
End Class

#3


我将你的程序粘贴后运行,同样存在上面的问题,真搞不懂!我用的是VB2008,你用的什么?难道是VB2008的Bug吗?

#4


真库恼!我现在正在编利用蓝牙PPC手机作蓝牙鼠标的应用程序,万事具备,只欠东风!就是这个问题困扰着我,真希望哪位DX指点一下.

#5


果然与VB版本有关,VB2005,VB2008均存在上述问题,可VB6就没问题,我只好用VB6生成一个DLL文件,在VB2008中进行引用,问题才得以解决,不过在没装VB6软件的电脑上,需要将DLL文件打包安装后,才能使用.请问你们用什么版本,有问题吗?

#6


我也是这样,我用的是vb2005。
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long
SetCursorPos(500, 111)
生成时也不会报错,x轴可以移动到500,但是y轴始终就是0。(用GetCursorPos测试过)




至于楼主说的mouse_event(MOUSEEVENTF_MOVE, 100, 200, 0, 0),这个我试过,x轴动不了,y轴可动,不过我用GetCursorPos测试时,y轴才到5,我的分辨率1024*768,个人感觉mouse_event的移动因该不是按分辨率来的。

#7


楼主,我用的就是vb2005,可是的确没有这个问题。。怀疑是其他原因造成的。

#8


引用 5 楼 hyallinone 的回复:
果然与VB版本有关,VB2005,VB2008均存在上述问题,可VB6就没问题,我只好用VB6生成一个DLL文件,在VB2008中进行引用,问题才得以解决,不过在没装VB6软件的电脑上,需要将DLL文件打包安装后,才能使用.请问你们用什么版本,有问题吗?

请问下,还有其他的解决方案吗?

#9


vb2005解决了,原来问题出现在这边。
Declare Function SetCursorPos Lib "user32" (ByVal X  As Long, ByVal Y  As Long)  As Long
Declare Function SetCursorPos Lib "user32" (ByVal x  As Integer, ByVal y  As IntegerAs Boolean
看来vb爱好者乐园里面的api手册有点问题。多谢cauhorse的指点。

#10


其实实现Mouse move可不用API,.net里有现成的函数:Cursor.Position=P 和p=Cursor.Position分别表示设置mouse位置和获取mouse位置,p as point (p.x,p.y)

#11


真是Long 和 integer的差别引起的,将Long 全部换成integer,问题得以解决,同样适用mouse_event函数,可能是32位和64位的原因吧,以后在引用API函数时可能均存在此问题,估计将Long 全部换成integer就成。Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
也存在类似问题。