用go实现一个通过模拟输入剪切板内容的程序

作者:
淡白
创建时间:
2021-06-08 20:32:38
工具 Go

摘要:该程序的目的是为了解决在禁用CV大法的程序中输入复杂或长字符串时的不便。它通过监听Ctrl + I的快捷键,将剪切板中的内容作为字符串读取,然后用按键库模拟输入字符串的每个字符。该程序使用了robotgo、clipboard和systray等库,并且集成了一个带有图标的托盘应用程序。在运行该程序时,会在托盘中显示一个图标,右键点击可以选择退出程序。然后通过按下Ctrl + I快捷键,即可模拟输入剪切板中的字符串。但需要注意的是,并不是所有程序都支持输入,需要进一步使用虚拟键盘才能实现对这些程序的支持。

简介

在有些程序中为了安全起见,禁用了CV大法。在输入很复杂很长窜的字符串时感觉很难受。于是便有了下面这个程序,该代码的核心部分是通过robotgo这个库封装的C代码实现的,所以没有什么硬代码。

代码


package main

import (
	_ "embed" //Go1.16支持将资源文件一同打包
	"github.com/atotto/clipboard" //读取剪切板
	"github.com/getlantern/systray" //托盘图标
	"github.com/go-vgo/robotgo" //按键库
	"os"
	"strings"
	"test/log"
	"time"
)
//下面这个注释就是添加本地静态资源的
//go:embed assets/jqb.ico
var iconData []byte
func main() {
	 systray.Run(onReady, onExit)
	for {
		if robotgo.AddEvents("i", "ctrl"){
			// 读取剪切板中的内容到字符串
			content, err := clipboard.ReadAll()
			if err != nil {
				log.LogErr(err)
			}
			split := strings.Split(content, "")
			for _, s := range split {
				time.Sleep(time.Millisecond*66)
				robotgo.KeyTap(s)
			}
		}
	}
}
func onReady() {
	systray.SetIcon(iconData)
	systray.SetTitle("帮你输入剪切板")
	systray.SetTooltip("帮你输入剪切板")
	mQuit := systray.AddMenuItem("退出", "点击退出应用程序")
	go func() {
		select {
		case <-mQuit.ClickedCh:
			os.Exit(0)
		}
	}()
}

func onExit() {

}

编译运行

通过命令go build -ldflags "-s -w -H=windowsgui"编译出来的程序没有命令行窗口。运行后在托盘会展示图标,右键可以选择退出。 运行效果image.png 快捷键Ctrl+I就能模拟输入剪切板内的字符串了。 注:并不是所有程序都支持输入,WeGame测试不行。 部分程序不支持,进一步支持需要用到虚拟键盘 https://github.com/ddxoft/master