C# 点击屏幕上的某一点

C# 点击屏幕上的某一点,c#,click,mouseevent,C#,Click,Mouseevent,我正在尝试通过c#执行鼠标单击。我使用鼠标事件函数来完成它 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

我正在尝试通过c#执行鼠标单击。我使用鼠标事件函数来完成它

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);
不管怎样,我都有一个奇怪的错误:

托管调试助手“PinvokeStackDistancer”在“C:\Users\or\Documents\Visual Studio 2010\Projects\ProjectName\ProjectName\bin\Debug\ProjectName.vshost.exe”中检测到问题。 附加信息:调用PInvoke函数“ProjectName!”!ProjectName.MainForm::mouse_事件“”使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配


关于解决方案有什么想法吗?

很明显,这段代码来自遗留的VB6代码。在.NET和C#中,long是64位的,而VB6是32位的

从long切换到int,应该没问题


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

我建议您使用以下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\u event
虽然方便,但已被取代。您可以在以下URL中找到SendInput和输入结构的合理p/invoke声明。

尝试将其类型更改为IntPtr,并将long更改为int。(将new IntPtr()作为extrainfo传递)。还是没有变化