2010-04-29 42 views
6

如何以编程方式触发鼠标上的左键单击事件?如何以编程方式触发鼠标左键单击C#?

谢谢。

编辑:事件不是直接在按钮上触发的。我瞄准的是Windows平台。

+2

在哪个平台?的WinForms? WPF? Silverlight的? web表单(= HTML/JavaScript的)?或只是“窗口”(低级别) – 2010-04-29 11:49:38

+0

可能的重复[如何模拟鼠标点击在C#?](http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c) – AlexanderMP 2017-05-16 11:46:35

回答

1

https://web.archive.org/web/20140214230712/http://www.pinvoke.net/default.aspx/user32.sendinput

使用Win32 API来发送输入。

更新:

因为我不再与Win32 API的工作,我不会更新这个答案是正确的,当平台的变化或网站变得不可用。由于这个答案甚至不符合Stackoverflow标准(不包含答案本身,而是一个到外部的,现在已经不存在的资源的链接),所以没有必要给它任何点数或花费更多时间。

相反,看看#2,我认为这个问题是一个重复:

How to simulate Mouse Click in C#?

+0

我发现不起作用,例如Visual Studio调试器在UINT下面和INPUT []下面放置一行,我发现没有UINT这样的类,尽管我可以将其更改为UInt32。但是,我并没有对INPUT []进行等效更改使其工作 – barlop 2017-05-15 13:08:13

+0

@barlop感谢挖掘这个遗物:),我很抱歉,我不能帮你。我将其标记为已弃用。寻找更好的答案,例如。这里http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c – AlexanderMP 2017-05-16 11:46:02

+0

你低估了你的答案的有效性Andrei说过,mouse_event解决方案已经过时,你的SendInput解决方案是更多最新..并在您链接到的问题,最高评价的答案有mouse_event解决方案..所以你的答案可能是最新的比那里的那个。仅仅因为一个好的网站,pinvoke已被劫持或重定向到redgate软件公司,并不意味着网页上的信息已经过时。事实上,目前pinvoke网站的主要页面说明维护。 – barlop 2017-05-16 12:46:38

8

如果它是正确的按钮,你可以使用

button1.PerformClick(); 

否则,你可以检查出this MSDN article其论述了模拟鼠标(和键盘)输入。

此外,this project也许能够帮助你。在封面下,它使用SendInput

+0

对我来说,Java似乎比C#有更好的内置支持,可以在任意位置轻松地在Windows中单击鼠标,但InputSimulator库正是我所需要的。你的答案应该更加突出。 – rob 2016-11-23 21:30:33

8

要进行鼠标点击:

[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 static void DoMouseClick() 
     { 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 
     } 

要移动光标,你想要:

[DllImport("user32.dll")] 
     static extern bool SetCursorPos(int X, int Y); 

     public static void MoveCursorToPoint(int x, int y) 
     { 
      SetCursorPos(x, y); 
     } 
+2

我看到了这个,试过了,但是mouse_event函数已经过时了。我正在尝试使用SendInput做同样的事情。 – Andrei 2010-04-29 12:41:42

+0

除了像Andrei指出的那样将mouse_event替换为SendInput之外,您还可以通过在第一个参数中设置MOUSEEVENTF_ABSOLUTE掩码并在第二个和第三个参数中传递x和y坐标来传递鼠标位置,而不是先调用SetCursorPos。 – rob 2016-11-23 19:26:24

+0

我会尝试使用这种方法,因为(作为sendinput回答评论),SendInput没有为我工作。使用这种方法,我得到了一个错误'Managed Debugging Assistant'PInvokeStackImbalance'在'C:\ Use ..... \ Debug \ hprog.vshost.exe'中检测到一个问题。 附加信息:对PInvoke函数'prog1!prog1.FrmBlah :: mouse_event'的调用使堆栈不平衡。这很可能是因为托管的PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名相匹配 – barlop 2017-05-15 13:11:14

-1
button1_click(null, new EventArgs()); 
相关问题