如何在 C# 中模拟鼠标按钮按下并按住

Posted

技术标签:

【中文标题】如何在 C# 中模拟鼠标按钮按下并按住【英文标题】:How to simulate mouse button down and being hold in C# 【发布时间】:2018-03-30 03:19:51 【问题描述】:

我希望模拟鼠标左键单击另一个窗口,并按住按钮约 2 秒。我试过以下代码:

        int WM_LBUTTONDOWN = 0x0201;
        int WM_LBUTTONUP = 0x0202;
        SendMessage(hd, WM_LBUTTONDOWN, new IntPtr(1), lParam);           
        Thread.Sleep(2000);
        SendMessage(hd, WM_LBUTTONUP, new IntPtr(1), lParam);

参数“hd”是另一个窗口的句柄,“lParam”包含坐标信息。但这并没有达到我的预期。我使用断点来调试代码。当“WM_LBUTTONDOWN”消息被发送到另一个窗口时,另一个窗口中的按钮被立即点击,而不是被按住等待消息“WM_LBUTTONUP”。

当我使用真正的鼠标单击并按住按钮时,spy++ 显示“WM_LBUTTONDOWN”和“WM_LBUTTONUP”之间除了“WM_MOUSEMOVE”之外没有任何其他消息。 Picture of Spy++ showed

那么,如何在 C# 中模拟鼠标按下并按住?任何建议都会有所帮助,谢谢!

【问题讨论】:

You can’t simulate keyboard input with PostMessage. 想做一件很奇怪的事……为什么? @DonBoitnott 我想在安卓模拟器上模拟鼠标点击,以便自动玩安卓网络游戏。但是游戏会通过测量游戏中的按钮被按住的时间来判断是不是人在玩游戏。人用手指或鼠标点击一个按钮大约需要100毫秒,而模拟点击的软件只需2毫秒。 【参考方案1】:

You can’t simulate keyboard input by sending window messages。您需要改用SendInput() (C# declaration)。

请参阅:Send keys through SendInput in user32.dll。

【讨论】:

【参考方案2】:

“mouse_event”API函数可以解决这个问题。但是副作用是鼠标指针会实际移动,程序运行时你不能移动鼠标,否则会点击错误的位置。

【讨论】:

您不能使用mouse_event(或SendInput)来定位特定窗口。输入总是转到前台窗口。

以上是关于如何在 C# 中模拟鼠标按钮按下并按住的主要内容,如果未能解决你的问题,请参考以下文章

c#全局鼠标事件以及鼠标事件模拟

Qt keyPressEvent、“Hold”和keyReleaseEvent处理按钮/鼠标点击

如何模拟鼠标点击和拖动?

安卓游戏模拟器电脑版怎么设置按键

C# winform窗体有个button按钮,我想鼠标点击它不松一直会触发一个事件?是button的哪个事件?

java--键盘事件类,按下回车则模拟鼠标