Виртуальная клавиатура DCEF4 не отображается - PullRequest
1 голос
/ 05 мая 2020

Я использую CEF4 Delphi из https://github.com/salvadordf/CEF4Delphi Я редактирую пример PopupBrowser2. Есть компонент Chromium1. Я добавил событие, которое должно уведомлять, когда запрашивается клавиатура:

procedure TForm1.Chromium1VirtualKeyboardRequested(Sender: TObject; const browser: ICefBrowser;
  input_mode: TCefTextInpuMode);
begin
   caption := 'kbd';
end;

К сожалению, когда пример загружает страницу Google, я нажимаю на поле редактирования поиска, и событие не вызывается. Как сделать так, чтобы событие было вызвано?

1 Ответ

1 голос
/ 08 мая 2020

TChromium.OnVirtualKeyboardRequested - одно из событий ICefRenderHandler, и этот обработчик используется только браузерами в внеэкранном режиме (режим OSR).

Демонстрация PopupBrowser2 использует браузеры в обычном режиме (он же «оконный режим»). "), что означает, что ни одно из событий ICefRenderHandler не будет запущено.

С PopupBrowser2 вам нужно будет использовать другое событие с именем GlobalCEFApp.OnFocusedNodeChanged

Проверьте имя узла с помощью HTML имена тегов, которые должны отображать виртуальную клавиатуру, например «input» или «textarea» внутри GlobalCEFApp.OnFocusedNodeChanged.

Это событие выполняется в процессе рендеринга, и вам нужно будет отправить сообщение процесса в основной процесс браузера, чтобы показать клавиатуру.

Демонстрация DOMVisitor показывает вам, как отправить это сообщение процесса с некоторыми параметрами, если они вам нужны: https://github.com/salvadordf/CEF4Delphi/blob/132edb2e8895d998d3e3810982c95b9f845d78f8/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas#L305

Процесс браузера получит это сообщение в TChromium.OnProcessMessageReceived, как вы можете видеть здесь: https://github.com/salvadordf/CEF4Delphi/blob/132edb2e8895d998d3e3810982c95b9f845d78f8/demos/Delphi_VCL/DOMVisitor/uDOMVisitor.pas#L432

Обратите внимание, что TCefProcessMessageRef создается функцией «New» с именем. Когда вы реализуете TChromium.OnProcessMessageReceived в своем приложении, вам нужно будет сравнить это message.name с таким же значением имени перед его обработкой.

...