- Notifications
You must be signed in to change notification settings - Fork910
RobotGo, Go Native cross-platform RPA and GUI automation@vcaesar
License
go-vgo/robotgo
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Golang Desktop Automation. Control the mouse, keyboard, read the screen, process, Window Handle, image and bitmap and global event listener.
RobotGo supports Mac, Windows, and Linux(X11); and robotgo supports arm64 and x86-amd64.
- Docs
- Binding
- Requirements
- Installation
- Update
- Examples
- Type Conversion and keys
- Cross-Compiling
- Authors
- Plans
- Donate
- Contributors
- License
ADB, packaging android adb API.
Robotn, binding JavaScript and other, support more language.
Now, Please make sureGolang, GCC
is installed correctly before installing RobotGo.
GolangGCC
Xcode Command Line Tools (And Privacy setting:#277)
xcode-select --install
MinGW-w64 (Use recommended) or others Mingwllvm-mingw;
Download the Mingw, then set system environment variablesC:\mingw64\bin
to the Path.Set environment variables to run GCC from command line.
Or the other GCC
(But you should compile the "libpng" with yourself when use thebitmap.)
GCCX11 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".)
# gccsudo apt install gcc libc6-dev# x11sudo apt install libx11-dev xorg-dev libxtst-dev# Clipboardsudo apt install xsel xclip## Bitmapsudo apt install libpng++-dev# GoHooksudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
# x11sudo dnf install libXtst-devel# Clipboardsudo dnf install xsel xclip## Bitmapsudo dnf install libpng-devel# GoHooksudo dnf install libxkbcommon-devel libxkbcommon-x11-devel xorg-x11-xkb-utils-devel
With Go module support (Go 1.11+), just import:
import"github.com/go-vgo/robotgo"
Otherwise, to install the robotgo package, run the command:
go get github.com/go-vgo/robotgo
png.h: No such file or directory? Please seeissues/47.
go get -u github.com/go-vgo/robotgo
Note go1.10.x C file compilation cache problem,golang #24355.go mod vendor
problem,golang #26366.
package mainimport ("github.com/go-vgo/robotgo")funcmain() {robotgo.MouseSleep=100robotgo.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 mainimport ("fmt""github.com/go-vgo/robotgo")funcmain() {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=100robotgo.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()iferr==nil {fmt.Println(text) }}
package mainimport ("fmt""strconv""github.com/go-vgo/robotgo""github.com/vcaesar/imgo")funcmain() {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)deferrobotgo.FreeBitmap(bit)img:=robotgo.ToImage(bit)imgo.Save("test.png",img)num:=robotgo.DisplaysNum()fori:=0;i<num;i++ {robotgo.DisplayID=iimg1,_:=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 mainimport ("fmt""github.com/go-vgo/robotgo""github.com/vcaesar/bitmap")funcmain() {bit:=robotgo.CaptureScreen(10,20,30,40)// use `defer robotgo.FreeBitmap(bit)` to free the bitmapdeferrobotgo.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 mainimport ("fmt""math/rand""github.com/go-vgo/robotgo""github.com/vcaesar/gcv""github.com/vcaesar/bitmap")funcmain() {opencv()}funcopencv() {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)deferrobotgo.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.Yrobotgo.Move(x,y-rand.Intn(5))robotgo.MilliSleep(100)robotgo.Click()res=gcv.FindAll(img1,img)// use find template and siftfmt.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 mainimport ("fmt"// "github.com/go-vgo/robotgo" hook"github.com/robotn/gohook")funcmain() {add()low()event()}funcadd() {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)}funclow() {evChan:=hook.Start()deferhook.End()forev:=rangeevChan {fmt.Println("hook: ",ev)}}funcevent() {ok:=hook.AddEvents("q","ctrl","shift")ifok {fmt.Println("add events...") }keve:=hook.AddEvent("k")ifkeve {fmt.Println("you press... ","k") }mleft:=hook.AddEvent("mleft")ifmleft {fmt.Println("you press... ","mouse left button") }}
package mainimport ("fmt""github.com/go-vgo/robotgo")funcmain() {fpid,err:=robotgo.FindIds("Google")iferr==nil {fmt.Println("pids... ",fpid)iflen(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)iferr==nil&&isExist {fmt.Println("pid exists is",isExist)robotgo.Kill(100) }abool:=robotgo.Alert("test","robotgo")ifabool {fmt.Println("ok@@@ ","ok") }title:=robotgo.GetTitle()fmt.Println("title@@@ ",title)}
- Refactor some C code to Go (such as x11, windows)
- Better multiscreen support
- Wayland support
- Update Window Handle
- Try to support Android and IOS
- Seecontributors page for full list of contributors.
- SeeContribution Guidelines.
Robotgo is primarily distributed under the terms of "both the MIT license and the Apache License (Version 2.0)", with portions covered by various BSD-like licenses.