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写了一个小工具。等下面文章会给出地址。看下效果吧