CEF模拟鼠标按下和键盘发送

7

我希望使用CEF控制一个Flash应用程序,因此我需要模拟MouseDown和KeySend而无需使用JavaScript。我正在使用离屏渲染。这是我尝试过的:

managedCefBrowserAdapter.OnMouseButton(
    500, 500, 0, true, 2, CefEventFlags.LeftMouseButton); 

或者

MouseEvent a = new MouseEvent();
a.Modifiers = CefEventFlags.LeftMouseButton;
a.X = 500;
a.Y = 500;

或者

managedCefBrowserAdapter.SendKeyEvent(0, 0, 0);

但是什么都不起作用。

1
你是否运行过CefSharp.Wpf.Example应用程序并在鼠标点击方法中设置断点以查看它的操作?我记得你需要发送两个事件,一个按下再加上一个抬起。键盘按键同理。 - amaitland
2个回答

17

这段代码对我很有效。单击一次在位置0, 0(左上角)。

browser.GetBrowser().GetHost().SendMouseClickEvent(0, 0, MouseButtonType.Left, false, 1, CefEventFlags.None);
System.Threading.Thread.Sleep(100);
browser.GetBrowser().GetHost().SendMouseClickEvent(0, 0, MouseButtonType.Left, true, 1, CefEventFlags.None);

2
非常完美!非常感谢你! - pohape
2
如何获取页面上特定按钮的点数?这是在猜测吗?我如何知道点击是否已执行。 - confusedMind
1
刚刚发现通过右键单击可以看到它点击的位置 :D - confusedMind
请问您能解释一下这里的参数吗?"false"、"true"和"1"分别代表什么意思? - ppau2004

9

以上的答案已经可以正常运作。我只想补充一些我认为非常重要的信息...


模拟鼠标点击(和移动):

// 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 - 点击发生在指定的xy坐标,但非常重要的是,这些坐标是相对于浏览器组件窗口(视口)的。因此,如果您的Web浏览器组件只有100px高,并且您将点击命令发送到y坐标为150px,则单击将发生但在Web浏览器之外,因此不在Web页面中。

3 - 查看是否真正执行了单击操作以及确切位置的一个技巧是将其从MouseButtonType.Left更改为MouseButtonType.Right。如果没有网页上的限制,则可以通过执行此操作查看“鼠标右键菜单”。如果您正在单击外部,则很可能会在操作系统(我在Windows上使用此技巧能够看到我在组件之外单击)上看到“鼠标右键菜单”。

4 - 在SendMouseClickEvent中的truefalse分别表示发送“鼠标按钮单击向下”事件和“鼠标按钮单击向上”事件。

5 - 要获取DOM中对象的位置,可以使用我在这里的回答方法:
CefSharp网页元素点击

6 - 因此,如果您在组件中加载了一个非常高的页面,并且需要单击位于组件边界之外的按钮,则需要滚动Web页面。您可以使用以下代码来完成:


模拟鼠标滚动(鼠标滚轮事件):

// send scroll command
// (mouse position X, mouse position Y, how much to scroll X, how much to scroll Y, events)
chromiumWebBrowser1.GetBrowser().GetHost().SendMouseWheelEvent(10, 10, 0, -100, CefEventFlags.None); 
Thread.Sleep(300);

大部分参数都不需要解释,但这里最重要的是第三和第四个参数,分别是“向右滚动多少像素”和“向下滚动多少像素”。向下滚动请使用负值,向上滚动请使用正值。在上面的代码中,它水平(x 轴)没有滚动任何东西(零像素),垂直向下滚动了100像素(y 轴)。

您可以在loop中使用此代码来滚动所需的距离。我将其与JavaScript代码配合使用,以检索按钮的位置,以便检测是否在视口内,或者是否需要再次发送滚动事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接