我尝试制作一个应用程序,让鼠标转到桌面上的外部点。 我有这个应用程序的问题。我收到错误然后按下按钮:
对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
答案 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
答案 1 :(得分:1)
首先,您使用的是VB6的API声明类型,与DLLImport
相比没有任何优势,而且您还要更新.NET的签名,更改所有那些Longs整数。
其次,mouse_event
函数已被SendInputs
方法取代为MSDN,并建议使用新方法。
所以,作为一个建议,你可以停止担心你的P /调用并使用我的SendInputs Helper Class,它提供了易于使用的方法来设置鼠标位置和模拟鼠标按钮点击。
使用示例:
SendInputs.MousePosition(100, 500)
SendInputs.MouseClick(SendInputs.MouseButton.LeftPress)