golang 檢測wins系統下是否安裝chrome
問題
- 目的:呼叫谷歌瀏覽器,開啟指定的網頁
- 問題:使用者系統沒有安裝chrome,會彈框報錯,這樣體驗非常不好,如果沒有安裝chrome,就應該使用ie瀏覽器開啟指定的網頁
呼叫chrome瀏覽器的程式碼
err := exec.Command("cmd", "/c","start chrome http://www.baidu.com").Run()
解決方案
- 方案一:
看看有沒有什麼辦法,能做到下面兩點,
1.1 如果使用者安裝了谷歌瀏覽器就可以開啟谷歌瀏覽器.
1.2 如果使用者沒有安裝谷歌瀏覽器,不會彈框報錯,而是返回錯誤資訊。
目前沒有找可行方案。。。 - 方案二:
在執行程式碼前先判斷系統是否安裝谷歌瀏覽器。黃金不負苦心人,找到了方案,通過檢測登錄檔的方式來判斷 ofollow,noindex">傳送門
執行
-
方案二的邏輯是:
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”的路徑,如圖
image.png
然後,我們開啟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 開開啟谷歌瀏覽器了。