使用golang在windows上设置全局快捷键的操作
作者:Aisre
最近在工作中,总是重复的做事,想着自己设置一个快捷键实现windows 剪贴板的功能,所以本文小编给大家分享了使用golang在windows上设置全局快捷键的操作,文中有相关的代码示例供大家参考,需要的朋友可以参考下
hotkey热键
1.需求
最近在工作中,总是重复的做事,想着自己设置一个快捷键实现windows 剪贴板的功能,网上找资料,用了一天时间实现热键功能
2.使用包
golang.design/x/hotkey golang.design/x/clipboard
这两都要魔法下载
3.开发文档
github的star不太多,上面的文档写得也很少
clipboard
hotkey
4.具体实现
package main import ( "fmt" "log" "os" "os/signal" "regexp" "strings" "syscall" "time" "golang.design/x/clipboard" "golang.design/x/hotkey" "golang.design/x/hotkey/mainthread" ) func main() { mainthread.Init(fn) } func fn() { err := clipboard.Init() if err != nil { panic(err) } // wg := sync.WaitGroup{} // wg.Add(2) go func() { for { err := listenHotkey(hotkey.KeyQ, hotkey.ModShift) if err != nil { log.Println(err) } textData := clipboard.Read(clipboard.FmtText) //log.Println(string(textData)) _ = clipboard.Write(clipboard.FmtText, []byte(processString(string(textData)))) } }() go func() { for { err := listenHotkey(hotkey.KeyW, hotkey.ModShift) if err != nil { log.Println(err) } //textData := clipboard.Read(clipboard.FmtText) //log.Println(string(textData)) _ = clipboard.Write(clipboard.FmtText, []byte(processString("<font color=red>**(核心步骤)**</font>"))) } }() go func() { for { err := listenHotkey(hotkey.KeyE, hotkey.ModShift) if err != nil { log.Println(err) } //textData := clipboard.Read(clipboard.FmtText) //log.Println(string(textData)) _ = clipboard.Write(clipboard.FmtText, []byte(processString("<font color=red>**(核心步骤)**</font>(1)报错问题的解释:"))) } }() go func() { for { err := listenHotkey(hotkey.KeyR, hotkey.ModShift) if err != nil { log.Println(err) } //textData := clipboard.Read(clipboard.FmtText) //log.Println(string(textData)) _ = clipboard.Write(clipboard.FmtText, []byte(processString("<font color=red>**(核心步骤)**</font>(2)问题的解决方法:"))) } }() sigChan := make(chan os.Signal, 1) // 注册多个信号 signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) // 启动 goroutine 处理信号 go func() { for { // 等待信号 sig := <-sigChan switch sig { case os.Interrupt: fmt.Println("Received interrupt signal (Ctrl+C)") case syscall.SIGTERM: fmt.Println("Received termination signal") case syscall.SIGQUIT: fmt.Println("Received quit signal (Ctrl+\\)") } // 执行清理工作,例如关闭资源 // 在实际应用中,你可能需要在这里添加自定义的清理逻辑 // 模拟一些清理工作 time.Sleep(2 * time.Second) // 退出程序 os.Exit(0) } }() for { // 在实际应用中,这里可能是程序的主要工作逻辑 time.Sleep(1 * time.Second) } } func listenHotkey(key hotkey.Key, mods ...hotkey.Modifier) (err error) { var ms []hotkey.Modifier ms = append(ms, mods...) hk := hotkey.New(ms, key) err = hk.Register() if err != nil { return } <-hk.Keydown() log.Printf("hotkey: %v is down\n", hk) <-hk.Keyup() log.Printf("hotkey: %v is up\n", hk) hk.Unregister() return } func processString(input string) string { // 使用正则表达式去除字符串两边的`` re := regexp.MustCompile("`(.*)`") matches := re.FindStringSubmatch(input) if len(matches) > 1 { input = matches[1] } // 去除两边空格 input = strings.TrimSpace(input) // 替换 <font color=red>**{}**</font> replacedContent := strings.ReplaceAll("<font color=red>**{}**</font>", "{}", input) //input = strings.ReplaceAll(, "<font color=red>**{}**</font>", "replacement_text") return replacedContent }
总结就是要多看issues上面得回答,在加上自己得经验。我还结合fyne写了一个小工具。等下面文章会给出地址。看下效果吧
5.fyne结合hotkey 开发一个辅助工具
以上就是使用golang在windows上设置全局快捷键的操作的详细内容,更多关于golang windows设置快捷键的资料请关注脚本之家其它相关文章!