CEF | CEF浏览器客户端功能扩展:实现点击链接后启动本地应用程序

举报
黑兔子 发表于 2022/10/17 16:32:33 2022/10/17
【摘要】 开发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”打头的网址用来打开本地的网页。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。