【问题标题】:How to programatically trigger a mouse left click in C#?如何以编程方式在 C# 中触发鼠标左键单击?
【发布时间】:2023-04-01 02:15:01
【问题描述】:

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

谢谢。

edit:事件不会直接在按钮上触发。我的目标是Windows平台。

【问题讨论】:

  • 在哪个平台上?窗体? WPF?银光?网络表单(=html/javascript)?或者只是“windows”(低级)

标签: c# click mouse


【解决方案1】:

如果它在一个按钮上,你可以使用

button1.PerformClick();

否则,您可以查看this MSDN article,其中讨论了模拟鼠标(和键盘)输入。

此外,this project 也可以为您提供帮助。在幕后,它使用SendInput

【讨论】:

  • 让我感到奇怪的是,Java 似乎比 C# 具有更好的内置支持,可以轻松地在 Windows 中的任意位置单击鼠标,但 InputSimulator 库正是我所寻找的。您应该在回答中更加突出这一点。
【解决方案2】:

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

使用 Win32 API 发送输入。

更新:

由于我不再使用 Win32 API,因此当平台更改或网站不可用时,我不会更新此答案以使其正确。由于这个答案甚至不符合 Stackoverflow 标准(不包含答案本身,而是指向外部的、现已失效的资源的链接),因此没有必要给它任何分数或花费更多时间。

相反,看看 Stackoverflow 上的这个问题,我认为这是重复的:

How to simulate Mouse Click in C#?

【讨论】:

  • 我发现这不起作用,例如Visual Studio 调试器在UINTINPUT[] 下放置了一行我看到没有像 UINT 这样的类虽然我可以将其更改为 UInt32 但我不知道 INPUT[] 的等效更改是什么工作
  • @barlop 感谢您挖掘此遗物 :) 很抱歉,我无法为您提供帮助。我将其标记为已弃用。寻找更好的答案,例如。这里stackoverflow.com/questions/2416748/…
  • 您低估了答案的有效性 Andrei 说 mouse_event 解决方案已过时,而您的 SendInput 解决方案已更新。在您链接的问题中,评价最高的答案有 mouse_event 解决方案。所以你的答案可能比那里的答案更新。并且仅仅因为一个好的网站,pinvoke 被劫持或被重定向到 redgate 软件公司,并不意味着网页上的信息已经过时。事实上,目前 pinvoke 网站的主页已停止维护。
【解决方案3】:

执行鼠标点击:

 [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);
        }

【讨论】:

  • 我看到了这个,试过了,但是mouse_event函数已经过时了。我现在正在尝试对 SendInput 做同样的事情。
  • 除了正如 Andrei 指出的那样,鼠标事件被 SendInput 取代之外,您还可以通过在第一个参数中设置 MOUSEEVENTF_ABSOLUTE 掩码并在第二个和第三个参数中传递 x 和 y 坐标来传递鼠标位置,而不是先调用 SetCursorPos。
  • 我会尝试使用这种方法,因为(正如对 sendinput 答案的评论),SendInput 对我来说还没有工作。使用这种方法我得到一个错误Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\Use.....\Debug\hprog.vshost.exe'. Additional information: A call to PInvoke function 'prog1!prog1.FrmBlah::mouse_event' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
相关资源
最近更新 更多