如何在 CEF 中捕获按键?
How to capture a keypress in CEF?
我想拦截 CEF 中的按键操作,因此我实际上可以实现一些快捷键。
我在 CEF API 文档 [1] 中读到,为了监听 KeyPress 事件,有必要实现接口,或者继承自 ClientKeyHandler
。然后覆盖两个方法:OnKeyEvent
和OnPreKeyEvent
。后者在按键到达用户界面之前被调用。
无论如何,我继续更改基于 CEF 的浏览器并覆盖这两个方法。此分支 [2](建立在 CefProject 的顶部)上可以进行更改。
启动浏览器并按任意键后,我在控制台中看不到任何 stderr/stdout 输出。似乎这些方法从未被调用过,这让我想知道我对它应该如何工作的理解是否正确。
这是我目前尝试过的方法:
diff --git a/examples/minimal/client_minimal.cc b/examples/minimal/client_minimal.cc
index ca8f7cc..70b527a 100644
--- a/examples/minimal/client_minimal.cc
+++ b/examples/minimal/client_minimal.cc
@@ -31,4 +31,10 @@ void Client::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
return shared::OnBeforeClose(browser);
}
+bool Client::OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) {
+ fprintf(stderr, "### Client::OnPreKeyEvent");
+
+ return false;
+}
+
} // namespace minimal
diff --git a/examples/minimal/client_minimal.h b/examples/minimal/client_minimal.h
index 86ed374..445375d 100644
--- a/examples/minimal/client_minimal.h
+++ b/examples/minimal/client_minimal.h
@@ -12,6 +12,7 @@ namespace minimal {
// Minimal implementation of client handlers.
class Client : public CefClient,
public CefDisplayHandler,
+ public CefKeyboardHandler,
public CefLifeSpanHandler {
public:
Client();
@@ -29,6 +30,9 @@ class Client : public CefClient,
bool DoClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
+ // CefKeyboardHandler methods:
+ bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) OVERRIDE;
+
- CEF版本:87.1.12+g03f9336+chromium-87.0.4280.88
- OS: Ubuntu 21.04
我解决了这个问题。
有必要覆盖方法 GetKeyboardHandler
和 return 现在正在实现 CefKeyboardHandler
的对象,非常类似于其他处理程序的工作方式(CefDisplayHandler
, CefLifespanHandler
, 等):
--- a/examples/minimal/client_minimal.h
+++ b/examples/minimal/client_minimal.h
@@ -19,6 +19,7 @@ class Client : public CefClient,
// CefClient methods:
CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE { return this; }
+ CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() OVERRIDE { return this; }
CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE { return this; }
// CefDisplayHandler methods:
我想拦截 CEF 中的按键操作,因此我实际上可以实现一些快捷键。
我在 CEF API 文档 [1] 中读到,为了监听 KeyPress 事件,有必要实现接口,或者继承自 ClientKeyHandler
。然后覆盖两个方法:OnKeyEvent
和OnPreKeyEvent
。后者在按键到达用户界面之前被调用。
无论如何,我继续更改基于 CEF 的浏览器并覆盖这两个方法。此分支 [2](建立在 CefProject 的顶部)上可以进行更改。
启动浏览器并按任意键后,我在控制台中看不到任何 stderr/stdout 输出。似乎这些方法从未被调用过,这让我想知道我对它应该如何工作的理解是否正确。
这是我目前尝试过的方法:
diff --git a/examples/minimal/client_minimal.cc b/examples/minimal/client_minimal.cc
index ca8f7cc..70b527a 100644
--- a/examples/minimal/client_minimal.cc
+++ b/examples/minimal/client_minimal.cc
@@ -31,4 +31,10 @@ void Client::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
return shared::OnBeforeClose(browser);
}
+bool Client::OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) {
+ fprintf(stderr, "### Client::OnPreKeyEvent");
+
+ return false;
+}
+
} // namespace minimal
diff --git a/examples/minimal/client_minimal.h b/examples/minimal/client_minimal.h
index 86ed374..445375d 100644
--- a/examples/minimal/client_minimal.h
+++ b/examples/minimal/client_minimal.h
@@ -12,6 +12,7 @@ namespace minimal {
// Minimal implementation of client handlers.
class Client : public CefClient,
public CefDisplayHandler,
+ public CefKeyboardHandler,
public CefLifeSpanHandler {
public:
Client();
@@ -29,6 +30,9 @@ class Client : public CefClient,
bool DoClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
+ // CefKeyboardHandler methods:
+ bool OnPreKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event, bool* is_keyboard_shortcut) OVERRIDE;
+
- CEF版本:87.1.12+g03f9336+chromium-87.0.4280.88
- OS: Ubuntu 21.04
我解决了这个问题。
有必要覆盖方法 GetKeyboardHandler
和 return 现在正在实现 CefKeyboardHandler
的对象,非常类似于其他处理程序的工作方式(CefDisplayHandler
, CefLifespanHandler
, 等):
--- a/examples/minimal/client_minimal.h
+++ b/examples/minimal/client_minimal.h
@@ -19,6 +19,7 @@ class Client : public CefClient,
// CefClient methods:
CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE { return this; }
+ CefRefPtr<CefKeyboardHandler> GetKeyboardHandler() OVERRIDE { return this; }
CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE { return this; }
// CefDisplayHandler methods: