Нажатие клавиши привязки Chromium Embedded Framework

Я видел эту тему на официальном форуме Chromium Embedded Framework, но кажется, что не было никаких решений. Честно говоря, мне не нравится платформа C++. Не могли бы вы помочь мне предоставить фрагмент, который связывает CEF с веб-приложением.

Я хотел управлять приложением, используя элементы управления по умолчанию:

ALT+F4 — закрыть
F5 — обновить браузер


person benjtupas    schedule 14.05.2014    source источник
comment
Вы ищете код C++, который будет захватывать ключевые события и отправлять их в CEF? Я считаю, что это происходит по умолчанию в CEFClient (при условии, что вы строите на этом) - в конце концов, вы можете вводить текстовые поля CEF...   -  person Sharadh    schedule 15.05.2014
comment
Добавлен ответ - уф, это заняло время!   -  person Sharadh    schedule 15.05.2014


Ответы (1)


Краткая версия: реализовать CefKeyboardHandler, в частности OnPreKeyEvent()

ClientHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
    const CefKeyEvent& event,
    CefEventHandle os_event,
    bool* is_keyboard_shortcut) {

    if (os_event && os_event->message == WM_SYSKEYDOWN) {
      case VK_F10: HandleF10(); break;
      case VK_F4: HandlerF4(); break; //Use GetKeyState(VK_MENU) to check if ALT is down...
    }
}

Это следует за проектом CefClient, где ClientHandler реализует CefKeyboardHandler. Проверьте client_handler_win.cpp

Далее следует более длинная версия...


Глядя на эту тему - события клавиатуры, "съеденные" браузером - это выделяется:

Когда элемент управления браузера имеет фокус, кажется, что любые нажатые клавиши поглощаются элементом управления браузером, независимо от того, могут ли они также обрабатываться элементом управления браузером или нет.

Теперь есть два варианта:

  1. Перехватите нажатие клавиши до того, как оно будет отправлено в механизм CEF, что потребует некоторого изучения CEF и зависит от конкретной платформы.

  2. Захватите нажатие клавиши с помощью обычного обработчика событий Javascript и выполните обратный вызов на C++.

  3. Перехватите нажатие клавиши до того, как механизм CEF обработает его, если CEF имеет такие интерфейсы — в идеале это должно быть независимым от платформы.

Захват нажатия клавиши на уровне собственного приложения

На компьютере с Windows я попытался найти WM_KEYDOWN, что является обычной практикой при захвате ключевых событий (См. здесь). Мне не удалось получить ни одного совпадения с проектом CefClient, которым я руководил, так что это был тупик.

Все, у кого есть дополнительная информация по этому вопросу, отредактируйте и добавьте сюда.

Захват нажатия клавиши в JS и обратный вызов на C++

Как только нажатие клавиши переходит в CefBrowser, мы всегда можем использовать Javascript для захвата желаемого нажатия клавиши, а затем вызывать обработчик приложения, например:

$(document).keypress(function (e) {
  ...
  NativeAppFunction();
  //Or NativeAppExtension.Function();
}

Взаимодействие между JS и C++ осуществляется либо через V8Extensions, либо путем привязки функции к CefContext. Дополнительную информацию см. на странице Интеграция JavaScript.

Это сопряжено с некоторыми подводными камнями: ваш захват событий является «просто еще одним обработчиком событий Javascript», и с этим связаны все неопределенности в отношении того, когда он вызывается (до или после других обработчиков событий) и так далее. К счастью, у CEF есть отличный маленький CefKeyboardHandler просто для того, чтобы делать то, что вы хотите!

Перехватить нажатие клавиши с помощью CefKeyboardHandler

См. cef_keyboard_handler.h - документ для OnPreKeyEvent() говорит:

// Called before a keyboard event is sent to the renderer. |event| contains
// information about the keyboard event. |os_event| is the operating system
// event message, if any. Return true if the event was handled or false
// otherwise. If the event will be handled in OnKeyEvent() as a keyboard
// shortcut set |is_keyboard_shortcut| to true and return false.

Отсюда это довольно просто. CefEventHandle преобразуется в специфичный для платформы (к сожалению, да ладно!) стандартный Windows MSG. Обратите внимание, что Alt+F4 — это специальная системная команда:

При нажатии клавиши окно, находящееся в фокусе клавиатуры, получает одно из следующих сообщений.

WM_SYSKEYDOWN (или) WM_KEYDOWN

Сообщение WM_SYSKEYDOWN указывает на системную клавишу, которая представляет собой нажатие клавиши, вызывающее системную команду. Существует два типа системных клавиш: ALT + любая клавиша и F10.

Полный текст в MSDN

person Sharadh    schedule 15.05.2014
comment
Можете ли вы получить статус мыши в OnPreKeyEvent()? - person gonzobrains; 23.12.2014