2017-10-20 14 views
0

を与える私はGetCursorPosを使用して、私のカーソルの位置を取得しようとしているが、それは、私はそれが何を意味するのか、または続行する方法を見つけ出すことができないんだカーソル位置がPInvokeStackImbalanceエラーに

Managed Debugging Assistant 'PInvokeStackImbalance' : 'A call to PInvoke function 'MoveClickApp!MoveClickApp.Module1::GetCursorPos' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.' 

私にエラーを与えます。何か案は?この方法に

Public Declare Function GetCursorPos Lib "user32" (ByVal lpPoint As POINTAPI) As UInt32 

Public Structure POINTAPI 
    Dim x As UInt32 
    Dim y As UInt32 
End Structure 

Public Function GetX() As UInt32 
    Dim n As POINTAPI 
    GetCursorPos(n) 
    GetX = n.x 
End Function 

Public Function GetY() As UInt32 
    Dim n As POINTAPI 
    GetCursorPos(n) 
    GetY = n.y 
End Function 

代替もまた、あなたはUINT32、xとyのためIntegerタイプを使用していないする必要があり、あなたの構造上LayoutKindを含める必要が

答えて

2

をいただければ幸いです。最後に、メソッドの戻り値の型はBOOLないUint32のであり、あなたはおそらく、結果をマーシャリングする必要があります

<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> 
Public Structure POINTAPI 
    Dim x As Integer 
    Dim y As Integer 
End Structure 

<DllImport("user32.dll", ExactSpelling := True, SetLastError := True)> _ 
Public Shared Function GetCursorPos(ByRef lpPoint As POINTAPI) As <MarshalAs(UnmanagedType.Bool)> Boolean 
End Function 

Pinvoke.netは、Win32 APIへの呼び出し時に使用するための素晴らしいリソースです。彼らのサンプルはこのメソッドを持っていますhere

+0

これは助けになりました!私は実際にこれらの<>コマンドを前にvbでマーシャリングしていないので、これは私が完全に理解するために調べる必要があるものです。奇妙なことに、この修正により無関係なSetCursorPosコマンドの誤動作が発生しましたが、私はそれを理解しようとします。助けてくれてありがとう – Zyzyx

関連する問題