Это 9-й день моего участия в Gengwen Challenge.Подробности мероприятия смотрите:Обновить вызов
Посмотрим на эффект реализации, вводим в браузереping so.com
Попробуйте открыть калькулятор, начатьsteam
Для достижения этого эффекта на самом деле используется пользовательский протокол браузера. Мы можем открыть WECHAT, кнопку и приложения Emali через пользовательский протокол и подождите. Например, в системе обслуживания Web Customer, она обычно используетсяtencent://
Пользовательский протокол предоставляет кнопку для чата, и когда мы нажимаем ее, браузер запускает внешнее приложение.
После того, как мы запишем пользовательский протокол в реестр, браузер запустит наше пилотное приложение в соответствии с протоколом, как показано ниже.tencent://
Протокол инициируетTimwp.exe
,Timwp.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>
form, а затем вызовите 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)
}
Соберём и скомпилируем в exe файл
go bulid urlCmd.go
будетurlCmd.exe
ставитьC:\Windows\system32\
каталог, поэтому мы можем использовать браузер дляcmd://
URL-адреса, открытые протоколом, будут перенаправлены в это приложение.
Я закончил школу, а ты?urlCmd.go
Есть еще много возможностей для улучшения, и заинтересованные студенты могут попробовать это, создав свой собственный парсер.
Если в статье есть недостатки, просьба указать их в комментариях.
Лайки, лайки и вопросы приветствуются. Следуйте за топ-менеджерами водораспределителей, которые иногда занимаются чем-то другим, кроме горячей воды.