点击屏幕上的某个点

本文关键字:屏幕 | 更新日期: 2023-09-27 18:10:07

我试图通过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);

无论如何,我是这个奇怪的错误:

管理调试助手' pinvokestack失衡'已检测到一个问题,在'C:'Users'or'Documents'Visual Studio 2010'Projects'ProjectName'ProjectName'bin'Debug'ProjectName.vshost.exe'。附加信息:调用PInvoke函数ProjectName!MainForm::mouse_event'使堆栈不平衡。这可能是因为托管的PInvoke签名与非托管的目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

有什么解决方案吗?

点击屏幕上的某个点

我建议您使用以下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

您显然是从遗留的VB6代码中获得这些代码的。在。net和c#中,long是64位的,不像VB6,它是32位的。

从long转换为int,应该没问题。

编辑:我有点快:dwExtraInfo应该是IntPtr类型的