Краткая версия: реализовать 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
Далее следует более длинная версия...
Глядя на эту тему - события клавиатуры, "съеденные" браузером - это выделяется:
Когда элемент управления браузера имеет фокус, кажется, что любые нажатые клавиши поглощаются элементом управления браузером, независимо от того, могут ли они также обрабатываться элементом управления браузером или нет.
Теперь есть два варианта:
Перехватите нажатие клавиши до того, как оно будет отправлено в механизм CEF, что потребует некоторого изучения CEF и зависит от конкретной платформы.
Захватите нажатие клавиши с помощью обычного обработчика событий Javascript и выполните обратный вызов на C++.
Перехватите нажатие клавиши до того, как механизм 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