问题
- 目的:调用谷歌浏览器,打开指定的网页
- 问题:用户系统没有安装chrome,会弹框报错,这样体验非常不好,如果没有安装chrome,就应该使用ie浏览器打开指定的网页
调用chrome浏览器的代码
err := exec.Command("cmd", "/c","start chrome http://www.baidu.com").Run()
解决方案
- 方案一:
看看有没有什么办法,能做到下面两点,
1.1 如果用户安装了谷歌浏览器就可以打开谷歌浏览器.
1.2 如果用户没有安装谷歌浏览器,不会弹框报错,而是返回错误信息。
目前没有找可行方案。。。 - 方案二:
在执行代码前先判断系统是否安装谷歌浏览器。黄金不负苦心人,找到了方案,通过检测注册表的方式来判断 传送门
执行
方案二的逻辑是:
1.1 原因
谷歌浏览器安装后都会 windows系统中注册表 “HKEY_CURRENT_USER”或“HKEY_LOCAL_MACHINE”目录下新增Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe项
1.2 如何做呢?
我们去到注册表里面检查下看上面说的注册表的信息是否存在 ,如果存在就是安装了谷歌浏览器,没有就没有安装。实现方案二的逻辑,代码如下
func CheckChrome() (string, bool) {
regpath := "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe"
checkKey := func(k *registry.Key) (string, bool) {
s, _, err := k.GetStringValue("")
if err != nil {
return "", false
}
return s, true
}
chs := make(chan registry.Key, 2)
queryKey := func(w *sync.WaitGroup, k registry.Key) {
defer w.Done()
key1, err := registry.OpenKey(k, regpath, registry.ALL_ACCESS)
if err == nil {
chs <- key1
}
}
waitGroup := new(sync.WaitGroup)
waitGroup.Add(2)
go queryKey(waitGroup, registry.CURRENT_USER)
go queryKey(waitGroup, registry.LOCAL_MACHINE)
waitGroup.Wait()
close(chs)
for k := range chs {
return checkKey(&k)
}
return "", false
}
猜想
- 猜想
我们打开浏览器的代码,就相当于打开cmd,在cmd中敲入“start chrome 地址”,打开谷歌谷歌浏览器。“start chrome ...”中的chrome,在注册表 “Software\Microsoft\Windows\CurrentVersion\App Paths\” 路径下,有个chrome项。因此猜想在注册表 “Software\Microsoft\Windows\CurrentVersion\App Paths” 路径下的项,都可以start XXX 运行。 -
测试猜想
我们在桌面新增一个“123.txt”文本,然后在“Software\Microsoft\Windows\CurrentVersion\App Paths\” 路径下新增a.exe 项,默认值赋值为“123.txt”的路径,如图
然后,我们打开cmd 敲入 “start a” 发现打开了123.txt文本,由此验证了我们的想法
在注册表“Software\Microsoft\Windows\CurrentVersion\App Paths”路径下的项,以exe结尾的,都可以 start xxx 运行。
总结
谷歌浏览器安装后 会在 注册表的“Software\Microsoft\Windows\CurrentVersion\App Paths\”路径下新增一个 chrome.exe的项,因为有了此项,我们就可在cmd窗口中运行start chrome 开打开谷歌浏览器了。
感谢社区
有疑问加站长微信联系(非本文作者)