我试图通过c#执行鼠标点击。我使用了mouse_event函数来完成它。
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
[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);
我尝试了两种方法:
将鼠标移动到该点并单击它:
Cursor.Position = new Point(100, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);
将所需点击的x,y传递给函数:
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,100, 100, 0, 0);
无论哪种方式,我都是这个奇怪的错误:
托管调试助手'PInvokeStackImbalance'在'C:\ Users \或\ Documents \ Visual Studio 2010 \ Projects \ ProjectName \ ProjectName \ bin \ Debug \ ProjectName.vshost.exe'中检测到问题。 附加信息:对PInvoke函数'ProjectName!ProjectName.MainForm :: mouse_event'的调用使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
关于解决方案的任何想法?
答案 0 :(得分:1)
我建议您使用以下p / invoke签名
private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
private const uint MOUSEEVENTF_LEFTUP = 0x04;
[DllImport("user32.dll")]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, IntPtr dwExtraInfo);
请注意,虽然mouse_event
方便,但它已被SendInput取代。您可以在以下URL找到SendInput和Input结构的合理p / invoke声明。
http://www.pinvoke.net/default.aspx/user32.SendInput
答案 1 :(得分:0)
您显然已从旧版VB6代码中获取此代码。在.NET和C#中,long是64位,与VB6不同,它是32位。
从long切换到int,它应该没问题。
编辑:我有点快:dwExtraInfo应该是IntPtr类型。