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)
}

未来计划

  1. 将部分C代码重构为Go代码(如x11、windows相关代码)
  2. 改进多屏幕支持
  3. 支持Wayland
  4. 更新窗口句柄处理
  5. 尝试支持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
		}
	}
}

注意事项

  1. 权限问题:在某些系统上可能需要管理员/root权限才能正常工作
  2. 跨平台差异:不同平台的键位名称可能不同,如"command"(Mac)对应"ctrl"(Windows/Linux)
  3. 性能考虑:频繁的屏幕操作可能影响性能
  4. 并发安全:Robotgo不是并发安全的,建议在主线程中使用

Robotgo非常适合编写自动化测试脚本、GUI自动化工具等。它的API设计简洁,功能强大,是Go语言中GUI自动化的首选库之一。

回到顶部