我們先來看看實現起來的效果,我們在瀏覽器中輸入ping so.com

試試開啟計算器、啟動steam

要實現這個效果其實用到了瀏覽器自定義協議,我們可以通過自定義協議開啟wechat、扣扣、emali應用等待。比如在web客服系統中通常會使用tencent://自定義協議提供一個扣扣聊天按鈕,當我們點選時瀏覽器會啟動外部應用。

我們將自定義協議寫入登錄檔後,瀏覽器會根據協議啟動我們的先導應用,如下在tencent://協議中啟動了一個Timwp.exeTimwp.exe將URL引數解析後啟動對應服務。

據此我們就可以自己註冊一個cmd協議來啟動我們的應用。我們將如下urlCmd.reg登錄檔檔案匯入到登錄檔HKEY_CLASSES_ROOT項中,當然也可以手動在登錄檔中新增項和字串來實現,我們告訴登錄檔我要註冊一個URL Protocol,他的目錄結構為HKEY_CLASSES_ROOT\cmd\shell\open\command

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\cmd]
@="URL: cmd protocol"
"URL Protocol"="" [HKEY_CLASSES_ROOT\cmd\shell] [HKEY_CLASSES_ROOT\cmd\shell\open] [HKEY_CLASSES_ROOT\cmd\shell\open\command]
@="C:\\Windows\\system32\\urlCmd.exe \"%1\""

匯入後看起來是這樣的,我們要啟動的先導應用為C:\Windows\system32\urlCmd.exe

接下來我們要編寫一個urlCmd.exe來實現我們需要的功能,這裡我們通過go來編寫,我們將傳過來的URL解析為<command> <arg>形式,然後呼叫cmd來執行。注意傳參是經過URL編碼的,在下面urlCmd.go我們只做了空格的解碼。

//urlCmd.go

package main

import (
"fmt"
"log"
"os"
"os/exec"
"strings"
"time"
) func main() {
var cmd_args, cmd_com string // 帶引數 不帶參
cmd_all := os.Args[1:] // [cmd://<command>%20<arg>] [cmd://<command>/]
cmd_cmd := strings.Split(string(cmd_all[0]), "//") // [cmd: <command>%20<arg>] [cmd: <command>/]
cmd_pre := strings.Split(string(cmd_cmd[1]), "%20") // [<command> <arg>] [<command>/] if len(cmd_pre) == 1 {
cmd_args = "" // 引數為空
} else {
cmd_args = strings.Replace(cmd_pre[1], "/", "", 1)
}
cmd_com = strings.Replace(cmd_pre[0], "/", "", 1) fmt.Printf("\ncommand: %v\nargs: %v\n", cmd_com, cmd_args)
cmd := exec.Command("cmd", "/c", cmd_com, cmd_args)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Fatalf("err:%v", err)
}
time.Sleep(2 * time.Second)
}

我們build一下編譯成exe檔案

go bulid urlCmd.go

urlCmd.exe放到C:\Windows\system32\目錄下即可,這樣我們在瀏覽器以cmd://協議開啟的URL都會路由到這個應用啦。


我學廢了,你呢?urlCmd.go還有許多改進空間,有興趣的同學可以做一個自己的解析器試試哦。


文章有不足的地方歡迎在評論區指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。