我不明白使用虚拟鼠标点击时此错误的含义

时间:2012-01-14 15:17:35

标签: c# winforms timer mouseevent

我正试图让鼠标点击当前鼠标位置。使用this site中的代码时。

我收到了一个错误:

  

调用PInvoke函数'Program!Program.Program :: mouse_event'具有   堆栈不平衡。这可能是因为托管PInvoke   签名与非托管目标签名不匹配。检查一下   调用约定和PInvoke签名匹配的参数   目标非托管签名。at line: mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,X,Y,0,0);。

我不明白这个问题所以原因是什么?我怎么能解决这个问题?

我的代码:

[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;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;

public void DoMouseClick()
{
    //Call the imported function with the cursor's current position
    int X = Cursor.Position.X;
    int Y = Cursor.Position.Y;
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
}

private void tmrClickInterval_Tick(object sender, EventArgs e)
{
    DoMouseClick();
}

1 个答案:

答案 0 :(得分:2)

您的DllImport签名无效。

dwFlagsdxdydwData的类型记录为DWORD,这是一个32位无符号整数。在C#中,long表示64位有符号整数。因此,您应该使用uint,它代表一个32位无符号整数。

最后一个参数dwExtraInfo是类型ULONG_PTR(指向无符号32位整数的指针),对应于C#中的UIntPtr

试试这个:

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