golang跨平台GUI自动化控制鼠标键盘插件库robotgo的使用
Golang跨平台GUI自动化控制鼠标键盘插件库robotgo的使用
简介
Robotgo是一个Golang桌面自动化库,可以控制鼠标、键盘,读取屏幕内容,处理窗口句柄、图像和位图,以及全局事件监听。它支持Mac、Windows和Linux(X11)平台,同时支持arm64和x86-amd64架构。
安装要求
在安装Robotgo之前,请确保已正确安装Golang和GCC。
所有平台
Golang
GCC
MacOS
brew install go
xcode-select --install
Windows
winget install Golang.go
winget install MartinStorsjo.LLVM-MinGW.UCRT
Ubuntu
sudo snap install go --classic
sudo apt install gcc libc6-dev
sudo apt install libx11-dev xorg-dev libxtst-dev
sudo apt install xsel xclip
sudo apt install libpng++-dev
sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
安装
使用Go模块支持(Go 1.11+)时,只需导入:
import "github.com/go-vgo/robotgo"
否则,运行以下命令安装robotgo包:
go get github.com/go-vgo/robotgo
更新
go get -u github.com/go-vgo/robotgo
示例代码
鼠标控制示例
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
robotgo.MouseSleep = 300
robotgo.Move(100, 100)
fmt.Println(robotgo.Location())
robotgo.Move(100, -200) // 支持多屏幕
robotgo.MoveSmooth(120, -150)
fmt.Println(robotgo.Location())
robotgo.ScrollDir(10, "up")
robotgo.ScrollDir(20, "right")
robotgo.Scroll(0, -10)
robotgo.Scroll(100, 0)
robotgo.MilliSleep(100)
robotgo.ScrollSmooth(-10, 6)
robotgo.Move(10, 20)
robotgo.MoveRelative(0, -10)
robotgo.DragSmooth(10, 10)
robotgo.Click("wheelRight")
robotgo.Click("left", true)
robotgo.MoveSmooth(100, 200, 1.0, 10.0)
robotgo.Toggle("left")
robotgo.Toggle("left", "up")
}
键盘控制示例
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
robotgo.TypeStr("Hello World")
robotgo.TypeStr("だんしゃり", 0, 1)
robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.")
robotgo.TypeStr("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.")
robotgo.Sleep(1)
robotgo.KeySleep = 100
robotgo.KeyTap("enter")
robotgo.KeyTap("i", "alt", "cmd")
arr := []string{"alt", "cmd"}
robotgo.KeyTap("i", arr)
robotgo.MilliSleep(100)
robotgo.KeyToggle("a")
robotgo.KeyToggle("a", "up")
robotgo.WriteAll("Test")
text, err := robotgo.ReadAll()
if err == nil {
fmt.Println(text)
}
}
屏幕操作示例
package main
import (
"fmt"
"strconv"
"github.com/go-vgo/robotgo"
"github.com/vcaesar/imgo"
)
func main() {
x, y := robotgo.Location()
fmt.Println("pos: ", x, y)
color := robotgo.GetPixelColor(100, 200)
fmt.Println("color---- ", color)
sx, sy := robotgo.GetScreenSize()
fmt.Println("get screen size: ", sx, sy)
bit := robotgo.CaptureScreen(10, 10, 30, 30)
defer robotgo.FreeBitmap(bit)
img := robotgo.ToImage(bit)
imgo.Save("test.png", img)
num := robotgo.DisplaysNum()
for i := 0; i < num; i++ {
robotgo.DisplayID = i
img1, _ := robotgo.CaptureImg()
path1 := "save_" + strconv.Itoa(i)
robotgo.Save(img1, path1+".png")
robotgo.SaveJpeg(img1, path1+".jpeg", 50)
img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")
x, y, w, h := robotgo.GetDisplayBounds(i)
img3, err := robotgo.CaptureImg(x, y, w, h)
fmt.Println("Capture error: ", err)
robotgo.Save(img3, path1+"_1.png")
}
}
窗口操作示例
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
fpid, err := robotgo.FindIds("Google")
if err == nil {
fmt.Println("pids... ", fpid)
if len(fpid) > 0 {
robotgo.TypeStr("Hi galaxy!", fpid[0])
robotgo.KeyTap("a", fpid[0], "cmd")
robotgo.KeyToggle("a", fpid[0])
robotgo.KeyToggle("a", fpid[0], "up")
robotgo.ActivePid(fpid[0])
robotgo.Kill(fpid[0])
}
}
robotgo.ActiveName("chrome")
isExist, err := robotgo.PidExists(100)
if err == nil && isExist {
fmt.Println("pid exists is", isExist)
robotgo.Kill(100)
}
abool := robotgo.Alert("test", "robotgo")
if abool {
fmt.Println("ok@@@ ", "ok")
}
title := robotgo.GetTitle()
fmt.Println("title@@@ ", title)
}
未来计划
- 将部分C代码重构为Go代码(如x11、windows相关代码)
- 改进多屏幕支持
- 支持Wayland
- 更新窗口句柄处理
- 尝试支持Android和IOS平台
Robotgo是一个功能强大的跨平台自动化库,可以用于各种GUI自动化任务,如测试自动化、屏幕截图、鼠标键盘模拟等。
更多关于golang跨平台GUI自动化控制鼠标键盘插件库robotgo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang跨平台GUI自动化控制鼠标键盘插件库robotgo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Robotgo - Go语言跨平台GUI自动化控制库
Robotgo是一个用Go语言编写的跨平台GUI自动化库,可以控制鼠标、键盘、读取屏幕信息等。它支持Windows、macOS和Linux三大平台。
安装Robotgo
首先需要安装Robotgo:
go get github.com/go-vgo/robotgo
注意:Robotgo依赖系统库,不同平台需要安装不同的依赖:
- Windows: 无需额外依赖
- macOS: 需要安装Xcode命令行工具
- Linux: 需要安装libx11-dev、libxtst-dev、libpng+±dev等
基本功能使用示例
1. 鼠标控制
package main
import (
"github.com/go-vgo/robotgo"
"time"
)
func main() {
// 移动鼠标到(100, 200)位置
robotgo.MoveMouse(100, 200)
// 获取当前鼠标位置
x, y := robotgo.GetMousePos()
println("Mouse position:", x, y)
// 鼠标点击(左键)
robotgo.MouseClick("left", false) // false表示不双击
// 鼠标拖动
robotgo.MouseToggle("down", "left")
robotgo.MoveMouseSmooth(300, 400, 1.0, 10.0)
robotgo.MouseToggle("up", "left")
// 鼠标滚轮
robotgo.ScrollMouse(10, "up") // 向上滚动10个单位
}
2. 键盘控制
package main
import (
"github.com/go-vgo/robotgo"
"time"
)
func main() {
// 输入字符串
robotgo.TypeString("Hello World")
// 按键操作
robotgo.KeyTap("enter") // 按回车键
robotgo.KeyTap("a", "ctrl") // Ctrl+A
// 按住和释放按键
robotgo.KeyToggle("a", "down")
time.Sleep(100 * time.Millisecond)
robotgo.KeyToggle("a", "up")
// 组合键
robotgo.KeyTap("n", "command") // Mac上的Command+N
}
3. 屏幕操作
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
// 获取屏幕尺寸
width, height := robotgo.GetScreenSize()
fmt.Printf("Screen size: %dx%d\n", width, height)
// 截屏
bitmap := robotgo.CaptureScreen(10, 20, 200, 300)
defer robotgo.FreeBitmap(bitmap) // 释放内存
// 保存截图
robotgo.SaveBitmap(bitmap, "screenshot.png")
// 获取屏幕颜色
color := robotgo.GetPixelColor(100, 200)
fmt.Println("Color at 100,200:", color)
}
4. 窗口控制
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
// 获取活动窗口
active := robotgo.GetActive()
title := robotgo.GetTitle(active)
fmt.Println("Active window:", title)
// 设置窗口位置和大小
robotgo.SetWindow(active, 100, 200, 800, 600)
// 最小化/最大化窗口
robotgo.MinWindow(active)
time.Sleep(1 * time.Second)
robotgo.MaxWindow(active)
}
高级功能
1. 图像查找
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
// 查找屏幕上指定图片的位置
bitmap := robotgo.OpenBitmap("icon.png")
defer robotgo.FreeBitmap(bitmap)
fx, fy := robotgo.FindBitmap(bitmap)
if fx != -1 && fy != -1 {
fmt.Printf("Found at %d, %d\n", fx, fy)
robotgo.MoveMouse(fx, fy)
} else {
fmt.Println("Image not found")
}
}
2. 事件监听
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
// 监听鼠标事件
mouseEvent := robotgo.AddEvent("mleft") // 监听左键点击
if mouseEvent {
fmt.Println("Left mouse button clicked")
}
// 监听键盘事件
fmt.Println("Press ESC to exit")
for {
if robotgo.AddEvent("esc") {
fmt.Println("ESC pressed")
break
}
}
}
注意事项
- 权限问题:在某些系统上可能需要管理员/root权限才能正常工作
- 跨平台差异:不同平台的键位名称可能不同,如"command"(Mac)对应"ctrl"(Windows/Linux)
- 性能考虑:频繁的屏幕操作可能影响性能
- 并发安全:Robotgo不是并发安全的,建议在主线程中使用
Robotgo非常适合编写自动化测试脚本、GUI自动化工具等。它的API设计简洁,功能强大,是Go语言中GUI自动化的首选库之一。