//go:build windows // +build windows package main import ( "os" "os/exec" "strconv" "syscall" "golang.org/x/sys/windows" ) type mainProgramStarter struct{} func (s *mainProgramStarter) GetMainName() string { return "main.exe" } func (s *mainProgramStarter) Start(targetExe string) error { cmd := exec.Command(targetExe) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr // Windows:新进程组,脱离 Ctrl+C / 父进程 cmd.SysProcAttr = &syscall.SysProcAttr{ CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, } return cmd.Start() } // 判断进程是否在运行 func (s *mainProgramStarter) IsProcessRunning(pid int) (bool, error) { if pid <= 0 { return false, nil } // 打开进程句柄 handle, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, uint32(pid)) if err != nil { // 权限不足,但进程存在 if err == windows.ERROR_ACCESS_DENIED { return true, nil } // 进程不存在 if err == windows.ERROR_INVALID_PARAMETER { return false, nil } // 其他错误 return false, err } defer windows.CloseHandle(handle) return true, nil } // 杀掉进程 func (w *mainProgramStarter) KillProcess(pid int) error { cmd := exec.Command("taskkill", "/PID", strconv.Itoa(pid), "/F") return cmd.Run() }