使用golang在windows上设置全局快捷键的操作

 更新时间:2024年02月01日 09:30:58   作者: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设置快捷键的资料请关注脚本之家其它相关文章!

相关文章

  • golang 交叉编译C++ dll配置文件的实现

    golang 交叉编译C++ dll配置文件的实现

    本文探讨了在64位环境下调用32位C++ DLL的的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 利用go语言编写一个并发包

    利用go语言编写一个并发包

    这篇文章主要为大家详细介绍了如何利用go语言编写一个并发包,适合大部分并发任务,开箱即用,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2023-10-10
  • Go读取文件与写入文件的三种方法操作指南

    Go读取文件与写入文件的三种方法操作指南

    在 Go 语言中也经常会遇到操作文件的需求,下面这篇文章主要给大家介绍了关于Go读取文件与写入文件的三种方法操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • golang jsoniter extension 处理动态字段的实现方法

    golang jsoniter extension 处理动态字段的实现方法

    这篇文章主要介绍了golang jsoniter extension 处理动态字段的实现方法,我们使用实例级别的 extension, 而非全局,可以针对不同业务逻辑有所区分,jsoniter 包提供了比较完善的定制能力,通过例子可以感受一下扩展性,需要的朋友可以参考下
    2023-04-04
  • GO中Json解析的几种方式

    GO中Json解析的几种方式

    本文主要介绍了GO中Json解析的几种方式,详细的介绍了几种方法, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Go语言strings.Repeat中5个高效用法(附性能对比)

    Go语言strings.Repeat中5个高效用法(附性能对比)

    本文深入探讨Go语言中strings.Repeat的5个高效用法,包括CLI工具视觉增强、测试数据生成、文本对齐优化、二进制协议处理及性能优化场景,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • Go语言基础学习教程

    Go语言基础学习教程

    这篇文章主要介绍了Go语言基础知识,包括基本语法、语句、数组等的定义与用法,需要的朋友可以参考下
    2016-07-07
  • Golang Cron 定时任务的实现示例

    Golang Cron 定时任务的实现示例

    这篇文章主要介绍了Golang Cron 定时任务的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Go手写数据库ZiyiDB的实现

    Go手写数据库ZiyiDB的实现

    本文主要介绍了Go手写数据库ZiyiDB的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • Golang interface{}的具体使用

    Golang interface{}的具体使用

    interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golang interface{}的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-05-05

最新评论