我应该怎么做才能使这段代码在VS 2010中运行?

时间:2010-07-08 17:56:30

标签: c# visual-studio-2010 mouse mouseevent

我手动使用此代码来模拟系统通过代码点击鼠标。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form
{
   [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 Form1()
   {
   }

   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);
   }

   //...other code needed for the application
}

但是现在我正在使用VS 2010和Windows 7,我现在得到了执行此代码的错误

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

所以对此有任何建议......

我遇到的错误是:

  

检测到PInvokeStackImbalance

     

对PInvoke函数的调用'ClickingApp!ClickingApp.Form1 :: mouse_event'使堆栈失去平衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

1 个答案:

答案 0 :(得分:5)

问题在于P / Invoke签名试试这个。

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

DWORD是32位,而C#long是64位

还注意到你正在指定调用约定,最好不要在为Windows API使用P / Invoke时指定它,或者你可以使用CallingConvention.Winapi,错误的调用约定通常是堆栈不平衡的原因