本人前段时间在开发MacOS项目的时候遇到一个问题,我用的框架是以SDL2为窗口、CEF3为浏览器加载HTML,当我想要用"Command+C"拷贝输入框账号时,发现无法全选,更不用说拷贝了,于是在某度上搜索了大半天愣是没找到解决方案,最后在CEF官网上找到了答案,这应该是CEF3的一个bug,在这里分享一下自己解决的经验。
PS:本人第一次写博客,多有不足之处,多多包涵。
主线程cpp片段(手动实现macOS的键盘组合键的全选、拷贝、粘贴以及剪切功能)
SDL_Event e;
uint32 modifiers = 0;
CefRefPtr<CefBrowser> browser;
browser = CefBrowserHost::CreateBrowserSync(window_info, this, url, browserSettings, nullptr);
while (SDL_PollEvent(&e) != 0)
switch (e.type)
case SDL_KEYDOWN:
CefKeyEvent event;
event.modifiers = keyboard_mod(e.key.keysym.mod);
event.windows_key_code = keyboard_code(e.key.keysym.scancode);
event.native_key_code = native_keyboard_code(e.key.keysym.scancode);
event.type = KEYEVENT_RAWKEYDOWN;
browser->GetHost()->SendKeyEvent(event);
if (modifiers & EVENTFLAG_COMMAND_DOWN) {
switch (event.native_key_code) {
case 0:
browser->GetFocusedFrame()->SelectAll();
break;
case 6:
browser->GetFocusedFrame()->Undo();
break;
case 7:
browser->GetFocusedFrame()->Cut();
break;
case 8:
browser->GetFocusedFrame()->Copy();
break;
case 9:
browser->GetFocusedFrame()->Paste();
break;
case 16:
browser->GetFocusedFrame()->Redo();
break;
modifiers = event.modifiers;
break;
辅助cpp片段(由于枚举太多了,只显示部分)
static const SDL_Scancode darwin_scancodes[] = {
SDL_SCANCODE_A,
SDL_SCANCODE_S,
SDL_SCANCODE_D,
SDL_SCANCODE_F,
SDL_SCANCODE_H,
SDL_SCANCODE_G,
SDL_SCANCODE_Z,
SDL_SCANCODE_X,
SDL_SCANCODE_C,
SDL_SCANCODE_V,
SDL_SCANCODE_NONUSBACKSLASH,
SDL_SCANCODE_B,
SDL_SCANCODE_Q,
SDL_SCANCODE_W,
SDL_SCANCODE_E,
SDL_SCANCODE_R,
SDL_SCANCODE_Y,
SDL_SCANCODE_T,
enum KeyboardCode {
VKEY_LWIN = 0x5B,
VKEY_COMMAND = VKEY_LWIN,
VKEY_RWIN = 0x5C,
int keyboard_mod(uint16_t const mod)
int result = EVENTFLAG_NONE;
if (mod & KMOD_NUM)
result |= EVENTFLAG_NUM_LOCK_ON;
if (mod & KMOD_CAPS)
result |= EVENTFLAG_CAPS_LOCK_ON;
if (mod & KMOD_CTRL)
result |= EVENTFLAG_CONTROL_DOWN;
if (mod & KMOD_SHIFT)
result |= EVENTFLAG_SHIFT_DOWN;
if (mod & KMOD_ALT)
result |= EVENTFLAG_ALT_DOWN;
if (mod & KMOD_GUI)
result |= EVENTFLAG_COMMAND_DOWN;
return result;
int keyboard_code(SDL_Scancode code)
if (code >= SDL_SCANCODE_1 && code <= SDL_SCANCODE_9)
return VKEY_1 + (code - SDL_SCANCODE_1);
else if (code >= SDL_SCANCODE_A && code <= SDL_SCANCODE_Z)
return VKEY_A + (code - SDL_SCANCODE_A);
else if (code >= SDL_SCANCODE_F1 && code <= SDL_SCANCODE_F12)
return VKEY_F1 + (code - SDL_SCANCODE_F1);
else if (code >= SDL_SCANCODE_F13 && code <= SDL_SCANCODE_F24)
return VKEY_F13 + (code - SDL_SCANCODE_F13);
switch (code)
case SDL_SCANCODE_LGUI:
return VKEY_LWIN;
case SDL_SCANCODE_RGUI:
return VKEY_RWIN;
default:
return VKEY_UNKNOWN;
int native_keyboard_code(SDL_Scancode code)
int native_code = 0;
int i = 0;
for (i = 0; i < SDL_arraysize(darwin_scancodes); i++)
if (code == darwin_scancodes[i])
native_code = i;
break;
return native_code;
至此,macOS的全选、拷贝、粘贴以及剪切功能全部完成。不过我发现了一个问题,当我使用“Command+A”全选时,文字没有显示选中的状态,只是鼠标光标消失了,目前不清楚这个问题如何解决,知道的大佬可以指教一二,感谢。
PS:如要转发,请标明出处。
本人前段时间在开发MacOS项目的时候遇到一个问题,我用的框架是以SDL2为窗口、CEF3为浏览器加载HTML,当我想要用"Command+C"拷贝输入框账号时,发现无法全选,更不用说拷贝了,于是在某度上搜索了大半天愣是没找到解决方案,最后在CEF官网上找到了答案,这应该是CEF3的一个bug,在这里分享一下自己解决的经验。PS:本人第一次写博客,多有不足之处,多多包涵。代码片段主线程cpp片段(手动实现macOS的键盘组合键的全选、拷贝、粘贴以及剪切功能)SDL_Event e;uint32 m
Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。除了提供C/C++接口外,也有其他语言的移植版。
因为基于Chromium,所以CEF支持Webkit& Chrome中实现的HTML5的特性,并且在性能上面,也比较接近Chrome。
CEF还提...
Visual Studio with NuGet Package Manager (&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;=2010).
使用Nuget添加引用,搜索CefSharp,
1、开发场景
在使用winform自带的webbrowser控件时,要考虑IE的版本以及HTML5的渲染问题,使用体验十分糟糕。毕竟webbrowser只是IE浏览器的一个包装壳罢了。
因此,考虑使用chromium的开源版本,开发一个可以使用多种应用场景的浏览器控件。 经过几番周折,终于基于CefSharp完成了该控件的设计,并结合选项卡控件开发了一款“多选项卡浏览器”。
此浏览器的基本功能和使用体验,接近Chrome浏览器,可以内嵌使用,可以用来做爬虫程序,可以与JavaScript交互进行自动化控制
JS 绑定官方介绍:https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration
1.cefSample
CEF中C++与JS交互,cef3 win32客户端
本项目配套博客网址:https://blog.csdn.net/leapmotion/article/details/80853508?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.
#7 0x2b4144361a2b blink::EventHandler::keyEvent()
#8 0x2b4143644051 blink::WebViewImpl::handleKeyEvent()
#9 0x2b41436446df blink::WebViewImpl::handleKeyEvent()
#10 0x2b414358580b blink::PageWidgetD
1、首先,CEF 有一套自己的消息循环机制,因此一般的调用 Windows API 像 CefSharp 向浏览器所在的窗口发送按键消息的方法是行不通的。
2、CefSharp 既可以嵌入 WinForm 应用程序,也可以嵌入 WPF 应用程序。CefSharp 本身带有向浏览器发送按键消息的 SendKeyEvent 函数。使用方法是:
Browser.GetBrowserHost().SendKeyEvent(KeyDownEnd);
其中,Browser 是 CefSharp 浏览器的实例:
全新的结帐和伺服构建。 有关为 OSX 构建 Servo 的更多信息,请查看:
在您检查伺服、安装其 deps 并能够构建之后,下一步是构建 CEF 端口:
./mach build-cef [--release]
如何构建 MiniServo
首先检查存储库及其子模块:
git clone https://github.com/pcwalton/miniservo-mac.git
cd miniservo-mac
git submodule update --init --recursive
git clone --recursive https://github.com/pcwalton/miniservo-mac
嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。
它的设计思想就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这...
"X" : cef3的主版本号;
"YYYY" :chrominum 分支号
"A" : 代表当前分支中,提交次数的一个增量。大概相当于svn中的版本号,但以分支为基础,可以帮助用户快速的确认同一分支中的构建顺序。
"gHHHHHHH" :是git提交的哈...
转载:https://www.deanhan.cn/js-paste-upload.html
转载:https://segmentfault.com/a/1190000002915597
转载:https://www.cnblogs.com/dcb3688/p/4610638.html
转载:https://blog.csdn.net/dongyuxu342719/article/...