CEF Имитация Mousedown и Keysend

Я хочу использовать CEF для управления приложением Flash, поэтому мне нужно имитировать MouseDown и KeySend без JavaScript. Я использую закадровый рендеринг. Вот что я пробовал:

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

or

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

or

managedCefBrowserAdapter.SendKeyEvent(0, 0, 0);

Но ничего не работает.


person Ludger    schedule 30.06.2015    source источник
comment
Вы запускали приложение CefSharp.Wpf.Example, ставя точки останова в методы щелчка мыши, чтобы посмотреть, что оно делает? По памяти, я думаю, вы обнаружите, что вам нужно отправить два события: вниз, за ​​которым следует вверх. То же самое относится и к нажатиям клавиш.   -  person amaitland    schedule 01.07.2015


Ответы (2)


Этот код работает для меня. Щелкает один раз по позиции 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);
person Technostar    schedule 21.01.2016
comment
Работает как шарм! Большое спасибо! - person Paul; 21.09.2016
comment
Как получить баллы за определенную кнопку на странице? это гадание в дикой природе? и как узнать, выполнен ли щелчок. - person confusedMind; 22.06.2017
comment
Только что понял, щелкнув правой кнопкой мыши, я вижу место, где он щелкает: D - person confusedMind; 22.06.2017
comment
Не могли бы вы объяснить параметры здесь. что значит false и true и 1? - person ppau2004; 15.11.2019

Ответ выше работает нормально. Я просто хотел бы добавить некоторую информацию, которую я считаю очень важной...


Имитировать щелчок мышью (и перемещение):

// 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, но очень важно знать, что эти координаты относятся к окну компонента браузера (области просмотра). Таким образом, если ваш компонент веб-браузера имеет высоту всего 100px и вы отправляете команду щелчка по координате y как 150px, щелчок произойдет но вне веб-браузера, следовательно, не на веб-странице.

3 - Один трюк, чтобы увидеть, действительно ли выполняется щелчок и где именно, изменить его с MouseButtonType.Left на MouseButtonType.Right. Сделав это, если на веб-странице нет ограничений, вы сможете увидеть меню правой кнопки мыши. Если вы щелкаете снаружи, есть вероятность, что вы увидите меню правой кнопки мыши в ОС (Windows здесь, и я смог увидеть, что с помощью этого трюка я щелкнул за пределами своего компонента) .

4 - true и false на SendMouseClickEvent должны отправлять событие нажатия кнопки мыши вниз и событие нажатия кнопки мыши вверх соответственно.

5. Чтобы получить позицию объекта в DOM, вы можете использовать подход к моему ответу здесь:
щелчок по элементу веб-страницы CefSharp

6 - Итак, если у вас в компоненте загружена очень высокая страница, и вам нужно нажать на кнопку, действительно находящуюся за пределами компонента, вам нужно прокрутить веб-страницу. Вы можете сделать это с помощью кода ниже:


Имитировать прокрутку мыши (событие колесика мыши):

// 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);

Большая часть параметров не требует пояснений, но наиболее важной частью здесь являются 3-й и 4-й параметры, которые определяют, насколько прокручивать X и сколько прокручивать Y. Чтобы прокрутить вниз, просто используйте отрицательные значения, а чтобы прокрутите вверх, положительные. В приведенном выше коде ничего не прокручивается (ноль пикселей) по горизонтали (ось x) и на 100 пикселей вниз по вертикали (ось y).

Вы можете использовать этот код внутри loop, чтобы прокручивать столько, сколько вам нужно. Я использую его в сочетании с кодом JavaScript, чтобы получить положение кнопки, чтобы определить, находится ли она в области просмотра или мне нужно снова отправить событие прокрутки.

person Vitox    schedule 06.12.2020