1.什么需求都是有的,你们懂得。我们就来实践下,兜住底,别让技术人的脸面掉地上了。
2.先从搜索开始,经过关键字切换,不断过滤,依据这边文章搞定大半 https://www.cnblogs.com/wang726zq/archive/2012/12/11/UrlProtocol.html
3.不同需求在于我这要求启动的应用是iexplore.exe,经过实践,因为协议完整没有处理的原因,会不停的关闭重启,今日开启关闭的不断循环中
4.解决问题从原因出发,需要启动应用后处理原来的网页链接内容。
5.步骤简述
1)定义协议头,传递参数,部署测试页面
<p> <a href='HkVideo://www.bing.com'>查看视频监控</a> </p> <button type='button' onclick='window.location.href = "HkVideo://http://www.baidu.com"'>查看视频监控</button>
上面两种触发机制都可以。
2)添加注册表文件,或者进入rededit手动添加到对应目录下 HKEY_CLASSES_ROOT\HkVideo\shell\open\command
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\HkVideo] @="Open HkVideo" "URL Protocol"="" [HKEY_CLASSES_ROOT\HkVideo\shell] [HKEY_CLASSES_ROOT\HkVideo\shell\open] [HKEY_CLASSES_ROOT\HkVideo\shell\open\command] @="\"d:\\youApp.exe\" \"%1\""
3)我是用golang build 了参数解析,执行命令的app,其他winform等形式都可以
package main import ( "bytes" "fmt" "log" "os" "os/exec" "strings" ) const ShellToUse = "C:/Program Files/Internet Explorer/iexplore.exe" func Shellout(command string) (error, string, string) { var stdout bytes.Buffer var stderr bytes.Buffer cmd := exec.Command(ShellToUse, command) cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() return err, stdout.String(), stderr.String() } func main() { fmt.Println(os.Args[1]) url := os.Args[1] index := strings.Index(url, "//") url = url[index+2:] // flag.StringVar(&url, "url", "google.com", "url program") // flag.Parse() fmt.Println(url) err, out, errout := Shellout(url) if err != nil { log.Printf("error: %v\n", err) } fmt.Println("--- stdout ---") fmt.Println(out) fmt.Println("--- stderr ---") fmt.Println(errout) }
4)app放到注册表的目录
总结 : 从页面链接触发自定义协议“HkVideo//”,会在注册表中寻找,如果已经注册过,则调用openIE.exe 程序,app接收到参数后处理,并附带参数执行命令行。