模拟鼠标单击错误

时间:2014-03-02 20:31:22

标签: vb.net cursor

我尝试制作一个应用程序,让鼠标转到桌面上的外部点。 我有这个应用程序的问题。我收到错误然后按下按钮:

  

对PInvoke函数'WindowsApplication1!WindowsApplication1.Form1 :: mouse_event'的调用使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

代码是:

 Public Declare Auto Function SetCursorPos Lib "User32.dll" _
        (ByVal X As Integer, ByVal Y As Integer) As Long Public 

 Declare Auto Function GetCursorPos Lib "User32.dll" _
        (ByRef lpPoint As Point) As Long Public 

 Declare Sub mouse_event Lib "user32" Alias "mouse_event" _
       (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _
        ByVal cButtons As Long, ByVal dwExtraInfo As Long) 

 Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down 
 Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up

 SetCursorPos(x, y) 'moves cursor to x,y position

 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'Invoke mouse down event
 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'Invoke mouse up event

2 个答案:

答案 0 :(得分:3)

这是一个非常容易理解的错误。

  

“... PInvoke签名与非托管目标签名不匹配......”

将您的代码更改为:

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Public Shared Sub mouse_event(dwFlags As Integer, dx As Integer, dy As Integer, dwData As Integer, dwExtraInfo As IntPtr)
End Sub

mouse_event function

答案 1 :(得分:1)

首先,您使用的是VB6的API声明类型,与DLLImport相比没有任何优势,而且您还要更新.NET的签名,更改所有那些Longs整数。

其次,mouse_event函数已被SendInputs方法取代为MSDN,并建议使用新方法。

所以,作为一个建议,你可以停止担心你的P /调用并使用我的SendInputs Helper Class,它提供了易于使用的方法来设置鼠标位置和模拟鼠标按钮点击。

使用示例:

SendInputs.MousePosition(100, 500)
SendInputs.MouseClick(SendInputs.MouseButton.LeftPress)