robotgo

2025-12-11 0 160

robotgo

Golang桌面自动化。控制鼠标,键盘,读取屏幕,过程,窗口句柄,图像和位图以及全局事件侦听器。

robotgo支持Mac,Windows和Linux(X11); robotgo支持ARM64和X86-AMD64。

内容

  • 文档
  • 结合
  • 要求
  • 安装
  • 更新
  • 例子
  • 输入转换和键
  • 交叉编译
  • 作者
  • 计划
  • 贡献者
  • 执照

文档

  • 戈多克
  • API文档(已弃用,没有更新)

绑定

ADB,包装Android ADB API。

机器人,绑定的JavaScript和其他,支持更多语言。

要求:

现在,请确保在安装robotgo之前正确安装Golang, GCC

全部:

 Golang

GCC

对于MacOS:

 brew install go

XCode命令行工具(和隐私设置:#277)

 xcode-select --install

对于Windows:

 winget install Golang.go
 winget install MartinStorsjo.LLVM-MinGW.UCRT

或mingw-w64(建议使用)或其他mingw llvm-mingw;

下载mingw,然后将系统环境变量C:\\mingw64\\bin设置为路径。将环境变量设置为从命令行运行GCC。

Or the other GCC (但使用位图时,您应该与自己一起编译“ libpng”。)

对于其他一切:

 GCC

X11 with the XTest extension (the Xtst library)

\"Clipboard\": xsel xclip


\"Bitmap\": libpng (Just used by the \"bitmap\".)

\"Event-Gohook\": xcb, xkb, libxkbcommon (Just used by the \"hook\".)

Ubuntu:
 # sudo apt install golang
sudo snap install go  --classic

# gcc
sudo apt install gcc libc6-dev

# x11
sudo apt install libx11-dev xorg-dev libxtst-dev

# Clipboard
sudo apt install xsel xclip

#
# Bitmap
sudo apt install libpng++-dev

# GoHook
sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
软呢帽:
 # x11
sudo dnf install libXtst-devel

# Clipboard
sudo dnf install xsel xclip

#
# Bitmap
sudo dnf install libpng-devel

# GoHook
sudo dnf install libxkbcommon-devel libxkbcommon-x11-devel xorg-x11-xkb-utils-devel

安装:

使用GO模块支持(GO 1.11+),只需导入:

 import \"github.com/go-vgo/ robotgo \"

否则,要安装robotgo软件包,请运行命令:

 go get github.com/go-vgo/ robotgo

PNG.H:没有这样的文件或目录?请参阅问题/47。

更新:

 go get -u github.com/go-vgo/ robotgo

注意GO1.10.x C文件编译缓存问题,Golang#24355。 go mod vendor问题,Golang#26366。

示例:

老鼠

robotgo"
)

func main() {
robotgo .MouseSleep = 300

robotgo .Move(100, 100)
fmt.Println( robotgo .Location())
robotgo .Move(100, -200) // multi screen supported
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 .ScrollRelative(10, -100)

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 . MouseSleep = 300

  robotgo . Move ( 100 , 100 )
  fmt . Println ( robotgo . Location ())
  robotgo . Move ( 100 , - 200 ) // multi screen supported
  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 .ScrollRelative(10, -100)

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

键盘

robotgo"
)

func main() {
robotgo .TypeStr("Hello World")
robotgo .TypeStr("だんしゃり", 0, 1)
// robotgo .TypeStr("テストする")

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)

// ustr := uint32( robotgo .CharCodeAt("Test", 0))
// robotgo .UnicodeType(ustr)

robotgo .KeySleep = 100
robotgo .KeyTap("enter")
// robotgo .TypeStr("en")
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\"

  \"github.com/go-vgo/ robotgo \"
)

func main () {
  robotgo . TypeStr ( \"Hello World\" )
  robotgo . TypeStr ( \"だんしゃり\" , 0 , 1 )
  // robotgo .TypeStr(\"テストする\")

  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 )

  // ustr := uint32( robotgo .CharCodeAt(\"Test\", 0))
  // robotgo .UnicodeType(ustr)

  robotgo . KeySleep = 100
  robotgo . KeyTap ( \"enter\" )
  // robotgo .TypeStr(\"en\")
  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 )
  }
}

屏幕

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

位图

robotgo"
"github.com/vcaesar/bitmap"
)

func main() {
bit := robotgo .CaptureScreen(10, 20, 30, 40)
// use `defer robotgo .FreeBitmap(bit)` to free the bitmap
defer robotgo .FreeBitmap(bit)

fmt.Println("bitmap…", bit)
img := robotgo .ToImage(bit)
// robotgo .SavePng(img, "test_1.png")
robotgo .Save(img, "test_1.png")

bit2 := robotgo .ToCBitmap( robotgo .ImgToBitmap(img))
fx, fy := bitmap.Find(bit2)
fmt.Println("FindBitmap—— ", fx, fy)
robotgo .Move(fx, fy)

arr := bitmap.FindAll(bit2)
fmt.Println("Find all bitmap: ", arr)

fx, fy = bitmap.Find(bit)
fmt.Println("FindBitmap—— ", fx, fy)

bitmap.Save(bit, "test.png")
}\”>

 package main

import (
  \"fmt\"

  \"github.com/go-vgo/ robotgo \"
  \"github.com/vcaesar/bitmap\"
)

func main () {
  bit := robotgo . CaptureScreen ( 10 , 20 , 30 , 40 )
  // use `defer robotgo .FreeBitmap(bit)` to free the bitmap
  defer robotgo . FreeBitmap ( bit )

  fmt . Println ( \"bitmap...\" , bit )
  img := robotgo . ToImage ( bit )
  // robotgo .SavePng(img, \"test_1.png\")
  robotgo . Save ( img , \"test_1.png\" )

  bit2 := robotgo . ToCBitmap ( robotgo . ImgToBitmap ( img ))
  fx , fy := bitmap . Find ( bit2 )
  fmt . Println ( \"FindBitmap------ \" , fx , fy )
  robotgo . Move ( fx , fy )

  arr := bitmap . FindAll ( bit2 )
  fmt . Println ( \"Find all bitmap: \" , arr )

  fx , fy = bitmap . Find ( bit )
  fmt . Println ( \"FindBitmap------ \" , fx , fy )

  bitmap . Save ( bit , \"test.png\" )
}

OPENCV

robotgo"
"github.com/vcaesar/gcv"
"github.com/vcaesar/bitmap"
)

func main() {
opencv()
}

func opencv() {
name := "test.png"
name1 := "test_001.png"
robotgo .SaveCapture(name1, 10, 10, 30, 30)
robotgo .SaveCapture(name)

fmt.Print("gcv find image: ")
fmt.Println(gcv.FindImgFile(name1, name))
fmt.Println(gcv.FindAllImgFile(name1, name))

bit := bitmap.Open(name1)
defer robotgo .FreeBitmap(bit)
fmt.Print("find bitmap: ")
fmt.Println(bitmap.Find(bit))

// bit0 := robotgo .CaptureScreen()
// img := robotgo .ToImage(bit0)
// bit1 := robotgo .CaptureScreen(10, 10, 30, 30)
// img1 := robotgo .ToImage(bit1)
// defer robotgo .FreeBitmapArr(bit0, bit1)
img, _ := robotgo .CaptureImg()
img1, _ := robotgo .CaptureImg(10, 10, 30, 30)

fmt.Print("gcv find image: ")
fmt.Println(gcv.FindImg(img1, img))
fmt.Println()

res := gcv.FindAllImg(img1, img)
fmt.Println(res[0].TopLeft.Y, res[0].Rects.TopLeft.X, res)
x, y := res[0].TopLeft.X, res[0].TopLeft.Y
robotgo .Move(x, y-rand.Intn(5))
robotgo .MilliSleep(100)
robotgo .Click()

res = gcv.FindAll(img1, img) // use find template and sift
fmt.Println("find all: ", res)
res1 := gcv.Find(img1, img)
fmt.Println("find: ", res1)

img2, _, _ := robotgo .DecodeImg("test_001.png")
x, y = gcv.FindX(img2, img)
fmt.Println(x, y)
}\”>

 package main

import (
  \"fmt\"
  \"math/rand\"

  \"github.com/go-vgo/ robotgo \"
  \"github.com/vcaesar/gcv\"
  \"github.com/vcaesar/bitmap\"
)

func main () {
  opencv ()
}

func opencv () {
  name := \"test.png\"
  name1 := \"test_001.png\"
  robotgo . SaveCapture ( name1 , 10 , 10 , 30 , 30 )
  robotgo . SaveCapture ( name )

  fmt . Print ( \"gcv find image: \" )
  fmt . Println ( gcv . FindImgFile ( name1 , name ))
  fmt . Println ( gcv . FindAllImgFile ( name1 , name ))

  bit := bitmap . Open ( name1 )
  defer robotgo . FreeBitmap ( bit )
  fmt . Print ( \"find bitmap: \" )
  fmt . Println ( bitmap . Find ( bit ))

  // bit0 := robotgo .CaptureScreen()
  // img := robotgo .ToImage(bit0)
  // bit1 := robotgo .CaptureScreen(10, 10, 30, 30)
  // img1 := robotgo .ToImage(bit1)
  // defer robotgo .FreeBitmapArr(bit0, bit1)
  img , _ := robotgo . CaptureImg ()
  img1 , _ := robotgo . CaptureImg ( 10 , 10 , 30 , 30 )

  fmt . Print ( \"gcv find image: \" )
  fmt . Println ( gcv . FindImg ( img1 , img ))
  fmt . Println ()

  res := gcv . FindAllImg ( img1 , img )
  fmt . Println ( res [ 0 ]. TopLeft . Y , res [ 0 ]. Rects . TopLeft . X , res )
  x , y := res [ 0 ]. TopLeft . X , res [ 0 ]. TopLeft . Y
  robotgo . Move ( x , y - rand . Intn ( 5 ))
  robotgo . MilliSleep ( 100 )
  robotgo . Click ()

  res = gcv . FindAll ( img1 , img ) // use find template and sift
  fmt . Println ( \"find all: \" , res )
  res1 := gcv . Find ( img1 , img )
  fmt . Println ( \"find: \" , res1 )

  img2 , _ , _ := robotgo . DecodeImg ( \"test_001.png\" )
  x , y = gcv . FindX ( img2 , img )
  fmt . Println ( x , y )
}

事件

robotgo"
hook "github.com/robotn/gohook"
)

func main() {
add()
low()
event()
}

func add() {
fmt.Println("— Please press ctrl + shift + q to stop hook —")
hook.Register(hook.KeyDown, []string{"q", "ctrl", "shift"}, func(e hook.Event) {
fmt.Println("ctrl-shift-q")
hook.End()
})

fmt.Println("— Please press w—")
hook.Register(hook.KeyDown, []string{"w"}, func(e hook.Event) {
fmt.Println("w")
})

s := hook.Start()
<-hook.Process(s)
}

func low() {
evChan := hook.Start()
defer hook.End()

for ev := range evChan {
fmt.Println("hook: ", ev)
}
}

func event() {
ok := hook.AddEvents("q", "ctrl", "shift")
if ok {
fmt.Println("add events…")
}

keve := hook.AddEvent("k")
if keve {
fmt.Println("you press… ", "k")
}

mleft := hook.AddEvent("mleft")
if mleft {
fmt.Println("you press… ", "mouse left button")
}
}\”>

 package main

import (
  \"fmt\"

  // \"github.com/go-vgo/ robotgo \"
  hook \"github.com/robotn/gohook\"
)

func main () {
  add ()
  low ()
  event ()
}

func add () {
  fmt . Println ( \"--- Please press ctrl + shift + q to stop hook ---\" )
  hook . Register ( hook . KeyDown , [] string { \"q\" , \"ctrl\" , \"shift\" }, func ( e hook. Event ) {
    fmt . Println ( \"ctrl-shift-q\" )
    hook . End ()
  })

  fmt . Println ( \"--- Please press w---\" )
  hook . Register ( hook . KeyDown , [] string { \"w\" }, func ( e hook. Event ) {
    fmt . Println ( \"w\" )
  })

  s := hook . Start ()
  <- hook . Process ( s )
}

func low () {
	evChan := hook . Start ()
	defer hook . End ()

	for ev := range evChan {
		fmt . Println ( \"hook: \" , ev )
	}
}

func event () {
  ok := hook . AddEvents ( \"q\" , \"ctrl\" , \"shift\" )
  if ok {
    fmt . Println ( \"add events...\" )
  }

  keve := hook . AddEvent ( \"k\" )
  if keve {
    fmt . Println ( \"you press... \" , \"k\" )
  }

  mleft := hook . AddEvent ( \"mleft\" )
  if mleft {
    fmt . Println ( \"you press... \" , \"mouse left button\" )
  }
}

窗户

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

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

作者

  • 作者是VZ
  • 维护者
  • 贡献者

计划

  • 重构一些C代码(例如X11,Windows)
  • 更好的多幕支持
  • Wayland支持
  • 更新窗口句柄
  • 尝试支持Android和iOS

贡献者

  • 有关贡献者的完整列表,请参见贡献者页面。
  • 请参阅贡献指南。

执照

robotgo主要按照“ Apache许可证(2.0版)”的条款分发,其中各种BSD样许可涵盖了部分。

请参阅许可证,许可证。

下载源码

通过命令行克隆项目:

git clone https://github.com/go-vgo/robotgo.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 robotgo https://www.zuozi.net/34146.html

DragonianVoice
上一篇: DragonianVoice
Cealing Host
下一篇: Cealing Host
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务