C# - 在记录良好的函数中检测到PInvokeStackImbalance?

时间:2010-05-31 13:40:10

标签: c# pinvoke

这是我的ClickMouse()函数的代码:

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);


    private const long MOUSEEVENTF_LEFTDOWN = 0x02;
    private const long MOUSEEVENTF_LEFTUP = 0x04;
    private const long MOUSEEVENTF_RIGHTDOWN = 0x08;
    private const long MOUSEEVENTF_RIGHTUP = 0x10;
    private void ClickMouse()
    {
        long X = Cursor.Position.X;
        long Y = Cursor.Position.Y;
        mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

    }

出于某种原因,当我的程序来到此代码时,它会抛出此错误消息:

  

检测到PInvokeStackImbalance消息:调用PInvoke函数   'WindowsFormsApplication1!WindowsFormsApplication1.Form1 :: mouse_event'   堆栈不平衡。这可能是因为托管PInvoke   签名与非托管目标签名不匹配。检查一下   调用约定和PInvoke签名匹配的参数   目标非托管签名。

请帮帮忙?

5 个答案:

答案 0 :(得分:13)

看起来你的DllImport声明是错误的。特别是使用Int64(longs)而不是UInt32。

以下是PInvoke参考文献中的一些细节:
http://www.pinvoke.net/default.aspx/user32.mouse_event

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, 
                               uint dwData,UIntPtr dwExtraInfo);

答案 1 :(得分:3)

我找到了这个声明

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, 
    uint dx, 
    uint dy, 
    uint dwData, 
    IntPtr dwExtraInfo);

答案 2 :(得分:3)

我使用以下格式使用RealGetWindowClass。

[DllImport("User32", CallingConvention=CallingConvention.Cdecl)]
public static extern int RealGetWindowClass(IntPtr hwnd, StringBuilder pszType, int cchType);

我正在调整'PInvokeStackImbalance'异常/错误。但是当我将CallingConvention改为

[DllImport("User32", CallingConvention=CallingConvention.StdCall)]

错误消失了。我在64位机器上使用VS2010。

答案 3 :(得分:2)

修复PInvokeStackImbalance错误:

按: CTRL + ALT + E

在“托管调试助手”下,取消选中PInvokeStackImbalance

答案 4 :(得分:1)

我将“Cdecl”改为“StdCall”,但它没有用。

正如Scott Weinstein所说,我们应该使用int类型。

[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags
{
    LEFTDOWN = 0x00000002,
    LEFTUP = 0x00000004,
    MIDDLEDOWN = 0x00000020,
    MIDDLEUP = 0x00000040,
    MOVE = 0x00000001,
    ABSOLUTE = 0x00008000,
    RIGHTDOWN = 0x00000008,
    RIGHTUP = 0x00000010
}

public static void LeftClick(int x, int y)
{
    Cursor.Position = new System.Drawing.Point(x, y);
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}