CEF | CEF浏览器客户端功能扩展:实现点击链接后启动本地应用程序
前言
开发CEF浏览器客户端过程中遇到一个问题:在网页中有一个功能,需要先点击网页上的链接下载一个特定的打印软件并在安装在本地,安装完成后点击第二个链接就可以启动本地安装好的打印软件。
在市面上流行的浏览器客户端中都可以实现这个功能,但是我自己写的基于CEF的浏览器客户端却没有响应。在网上搜了很多也没有找到解决办法。现在解决了这个问题,分享一下。
原理
点击第二个启动本地软件的链接时,会响应ClientHandler::OnBeforeBrowse()方法,默认会执行return false去完成网页的跳转。但是我们这里并不是去跳转一个新的网页,而是启动本地程序,所以就要在OnBeforeBrowse函数中进行网址的区分。
正常的网址一般是带有http、https、chrome、devtools、file等字段的,但是这个特殊的链接是以一个特殊的字段print打头的。当然,如果是别的程序,它的打头子段也会不一样。所以,我们只能通过排除的方法来进行筛选。
启动本地程序的原理是通过读注册表的方式实现的。通过“:”截取网址,冒号前面的“print”就是注册表中的文件夹名称,这个文件夹在注册表的HKEY_CLASSES_ROOT文件夹下,找到print文件夹下的DefaultIcon,可以看到是一串以exe结尾的字符串,这就是要启动的程序。冒号后面的一串数值就是启动参数。
最后,通过shell的方式将应用程序启动起来就可以了。这里要注意的是,启动程序要函数要return true,否则会执行打开一个新的网页。
实现
//网址筛选
QString url = QString::fromStdWString(request->GetURL());
if((!url.contains("http")) &&
(!url.contains("chrome")) &&
(!url.contains("devtools")) &&
(!url.contains("file")) &&
(url.contains(":")))
{
//启动程序
……
return true;
}
//启动程序
// “:”前为注册表中文件夹名称,“:”后为启动参数
QStringList urlList = url.split(":");
QString path = "HKEY_CLASSES_ROOT\" + urlList[0] + "\DefaultIcon";
QString filePath = GetRegStr(path,"Default");
if(!filePath.isEmpty())
{
// 获取exe所在路径
QStringList filePathList = filePath.split(",");
for(int i=0; i<filePathList.size(); i++)
{
if(filePathList[i].contains(".exe"))
{
filePath = filePathList[i];
break;
}
}
// 启动参数
QString params = "";
if(urlList.size() > 1)
{
params = urlList[1];
}
ShellExecuteA(0, "open", filePath.toLocal8Bit(), params.toLocal8Bit(), NULL, SW_HIDE);
}
其他
"chrome"打头的网址用来打开谷歌自带的网页。
“devtools”打头的网址用来启动谷歌内核的拓展工具窗口,比如调用控制台。
“file”打头的网址用来打开本地的网页。
- 点赞
- 收藏
- 关注作者
评论(0)