我手动使用此代码来模拟系统通过代码点击鼠标。
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签名的调用约定和参数是否与目标非托管签名匹配。
答案 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,错误的调用约定通常是堆栈不平衡的原因