javascript - SendMouseClickEvent 有时不起作用
问题描述
我正在尝试在HTML5
canvas
using上模拟单击事件SendMouseClickEvent
,但即使有时这有效,有时也无效。这是我用来模拟点击的代码片段:
browser.GetBrowser().GetHost().SendMouseMoveEvent(300, 25, false, CefEventFlags.None);
browser.GetBrowser().GetHost().SendMouseClickEvent(300, 25, MouseButtonType.Left, false, 1, CefEventFlags.None);
browser.GetBrowser().GetHost().SendMouseClickEvent(300, 25, MouseButtonType.Left, true, 1, CefEventFlags.None);
例如; 当我加载这个游戏时ChromiumWebBrowser
,虽然它在我们点击跳过介绍的前两个场景中运行良好,但canvas
这种方法在游戏中不起作用。我很确定它仍然会点击那里,但我不知道这里发生了什么。
解决方案
模拟鼠标点击(和移动):
// get browser host
var wbHost = chromiumWebBrowser1.GetBrowser().GetHost();
// clicking cordinates
int xPosition = 100;
int yPosition = 300;
// send mouse move event
wbHost.SendMouseMoveEvent(xPosition, yPosition, false, CefEventFlags.None);
Thread.Sleep(50);
// send click
wbHost.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, false, 1, CefEventFlags.None);
Thread.Sleep(50);
wbHost.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, true, 1, CefEventFlags.None);
1 - 有时(特别是反爬虫环境)还需要模拟鼠标移动。我使用SendMouseMoveEvent
第一行中所示的方法进行操作。
2 - 单击发生在指定的坐标x
和y
坐标处,但非常重要的是要知道该坐标是相对于浏览器组件窗口(视口)的。因此,如果您的 Web 浏览器组件只是100px
很高,并且您发送一个单击命令来y
协调150px
单击将发生但在 Web 浏览器之外,因此不在网页中。
3 - 查看点击是否真的被执行以及具体在哪里执行的一个技巧是将其从 更改MouseButtonType.Left
为MouseButtonType.Right
. 这样做,如果网页没有限制,你就能看到“鼠标右键菜单”。如果您在外部单击,您可能会在操作系统上看到“鼠标右键菜单” (此处为 Windows,我可以看到我使用此技巧在组件外部单击)。
4 - 此外,使用的延迟Thread.Sleep(50);
使组件有时间正确执行事件。
推荐阅读
- scala - Scala 将 DateTime 值转换为时间戳
- java - 使用 Apache ExceptionUtils.getRootCause 处理异常是否正确?
- r - 数据框写入 write.csv/write.table R 中的单个列
- spring - 扩展 Spring MVC 类
- java - 消费者在重新启动之前无法从新创建的分区轮询
- c++ - lambda 捕获的对 std::cout 的本地引用而不要求它
- vba - 代码性能,使用 VBA 写入 Word 文档
- python-3.x - 使用numpy和cupy的数组类型的差异
- javascript - 订阅未使用 ApolloServer 连接
- sql - 需要帮助了解 SQL 窗口函数之间的范围