我正试图让鼠标点击当前鼠标位置。使用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();
}
答案 0 :(得分:2)
您的DllImport签名无效。
dwFlags
,dx
,dy
和dwData
的类型记录为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);