gpt4 book ai didi

c# - "A call to a PInvoke function has unbalanced the stack"

转载 作者:太空狗 更新时间:2023-10-29 19:52:02 30 4
gpt4 key购买 nike

我在 visual c# 中创建了一个 Form 应用程序,它使用一个函数来生成鼠标点击,但我收到以下错误消息:

A call to PInvoke function '...Form1::mouse_event' 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.

我的代码:

[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 int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;

...

void GenerateMouseClick(int x, int y)
{
Cursor.Position = new Point((int)x, (int)y);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);
}

最佳答案

您的 Win32 API 声明不正确:'long' 映射到 .NET Framework 中的 Int64,这对于 Windows API 调用几乎总是不正确。

用 int 替换 long 应该可行:

public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

为了将来引用,您可能希望在寻找调用 API 函数的正确方法时检查 pinvoke.net——尽管它并不完美,但它会显示 correct declaration for mouse_event。 .

(编辑,2012 年 3 月 26 日): 虽然我提供的声明确实有效,但将 long 替换为 uint 会更好,因为 Win32 的 DWORD 是 32 位 unsigned 整数。在这种情况下,您可以改用带符号的整数(因为标志和其他参数都不会大到足以导致符号溢出),但情况并非总是如此。 pinvoke.net 声明是正确的,如下所示:

public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

这个问题的另一个答案已经提供了这个正确的声明,并且评论中也指出了uint的问题。我编辑了自己的答案以使其更加明显;其他 SO 参与者也应该随时编辑不正确的帖子,顺便说一句。

关于c# - "A call to a PInvoke function has unbalanced the stack",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855438/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com