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

Mob*_*bin 4 c# mouse visual-studio-2010 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
}
Run Code Online (Sandbox Code Playgroud)

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

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
Run Code Online (Sandbox Code Playgroud)

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

我遇到的错误是:

检测到PInvokeStackImbalance

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

Chr*_*lor 5

问题是P/Invoke签名试试这个.

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

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

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