package main import ( "fmt" "io" "log" "os" "slices" "syscall" // _ "embed" "fyne.io/systray" hook "github.com/robotn/gohook" ) var ( us32 = syscall.MustLoadDLL("user32.dll") SetForegroundWindow = us32.MustFindProc("SetForegroundWindow") GetForegroundWindow = us32.MustFindProc("GetForegroundWindow") ) // //go:embed duck2.jpg // var icon []byte var Error *log.Logger var Warning *log.Logger func init() { log.SetFlags(log.Lmicroseconds | log.Lshortfile) logFile, err := os.Create("main.log") if err != nil { log.Printf("Error creating log file: %v", err) os.Exit(1) } logger := io.MultiWriter(os.Stdout, logFile) log.SetOutput(logger) Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout), fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) Warning = log.New(io.MultiWriter(logFile, os.Stdout), fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"), log.Lmicroseconds|log.Lshortfile) } var processes = []uintptr{} func main() { go systray.Run(onReady, nil) hook.Register(hook.KeyDown, []string{"alt", "-"}, func(e hook.Event) { hwnd, _, _ := GetForegroundWindow.Call() if slices.Contains(processes, hwnd) { processes = slices.DeleteFunc(processes, func(i uintptr) bool { return i == hwnd }) } else { processes = append(processes, hwnd) } log.Printf("%#v", processes) }) hook.Register(hook.KeyDown, []string{"alt", "1"}, func(e hook.Event) { TabTo(0) }) s := hook.Start() <-hook.Process(s) } func TabTo(idx int) { log.Printf("TabTo: %d", idx) log.Printf("%+v", processes) if idx > len(processes) { Warning.Printf("idx %d is greater than length of processes %d", idx, len(processes)) return } hwnd := processes[idx] if hwnd == 0 { Warning.Printf("hwnd for idx %d is 0", idx) return } SetForegroundWindow.Call(hwnd) } func onReady() { // Icons no workey... idk why... // systray error: unable to set icon: The operation completed successfully. //systray.SetIcon(icon) systray.SetTitle("Awesome App") systray.SetTooltip("Pretty awesome超级棒") mQuit := systray.AddMenuItem("Quit", "Quit the whole app") go func() { <-mQuit.ClickedCh fmt.Println("Requesting quit") systray.Quit() os.Exit(0) // TODO: Quit properly, not this exit bullshit fmt.Println("Finished quitting") }() // Sets the icon of a menu item. Only available on Mac and Windows. //mQuit.SetIcon(icon) }