相关文章推荐
飘逸的鞭炮  ·  python selenium ...·  3 月前    · 
另类的牛肉面  ·  使用 NTP/Chrony 同步 ...·  7 月前    · 
月球上的莲藕  ·  vba split 回车-掘金·  1 年前    · 
完美的酱牛肉  ·  Nuget Warnings in VS ...·  1 年前    · 

本人前段时间在开发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);
            /* 记录Command命令并实现对应的功能 */
            if (modifiers & EVENTFLAG_COMMAND_DOWN) {
                switch (event.native_key_code) {
                    case 0: // A
                        browser->GetFocusedFrame()->SelectAll();
                        break;
                    case 6: // Z
						browser->GetFocusedFrame()->Undo();
                        break;
                    case 7: // X
                        browser->GetFocusedFrame()->Cut();
                        break;
                    case 8: // C
                        browser->GetFocusedFrame()->Copy();
                        break;
                    case 9: // V
                        browser->GetFocusedFrame()->Paste();
                        break;
                    case 16: // Y
                        browser->GetFocusedFrame()->Redo();
                        break;
            modifiers = event.modifiers;
		break;
		/* 省略 */
	/* 省略 */

辅助cpp片段(由于枚举太多了,只显示部分)

/* mac版本使用 */
static const SDL_Scancode darwin_scancodes[] = {
    /*   0 */   SDL_SCANCODE_A,
    /*   1 */   SDL_SCANCODE_S,
    /*   2 */   SDL_SCANCODE_D,
    /*   3 */   SDL_SCANCODE_F,
    /*   4 */   SDL_SCANCODE_H,
    /*   5 */   SDL_SCANCODE_G,
    /*   6 */   SDL_SCANCODE_Z,
    /*   7 */   SDL_SCANCODE_X,
    /*   8 */   SDL_SCANCODE_C,
    /*   9 */   SDL_SCANCODE_V,
    /*  10 */   SDL_SCANCODE_NONUSBACKSLASH,
    /*  11 */   SDL_SCANCODE_B,
    /*  12 */   SDL_SCANCODE_Q,
    /*  13 */   SDL_SCANCODE_W,
    /*  14 */   SDL_SCANCODE_E,
    /*  15 */   SDL_SCANCODE_R,
    /*  16 */   SDL_SCANCODE_Y,
    /*  17 */   SDL_SCANCODE_T,
    /* 省略 */
enum KeyboardCode {
	/* 省略 */
	VKEY_LWIN = 0x5B,	
	VKEY_COMMAND = VKEY_LWIN,  // Provide the Mac name for convenience.
	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;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 CEFC++与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/...