2011-10-01 47 views
0

我正在尝试通过c#执行鼠标单击。我使用mouse_event函数来完成它。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); 

无论哪种方式,我是这个奇怪的错误:

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

解决方案的任何想法?

回答

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

0

您显然已从旧版VB6代码中获得此代码。在.NET和C#中,long是64位,与VB6不同,它是32位的。

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

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

+0

尝试将其类型更改为IntPtr并将long更改为int。 (通过新的IntPtr()作为extrainfo)。仍然没有变化 – user779444