Skip to content

Commit c2aacfb

Browse files
Initial Commit. Implemented screenshotting full display methods
0 parents  commit c2aacfb

File tree

5 files changed

+225
-0
lines changed

5 files changed

+225
-0
lines changed

go.mod

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module go-screen-cli
2+
3+
go 1.24.5
4+
5+
require (
6+
github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc // indirect
7+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
8+
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
9+
github.com/ebitengine/purego v0.8.3 // indirect
10+
github.com/gen2brain/shm v0.1.1 // indirect
11+
github.com/go-ole/go-ole v1.3.0 // indirect
12+
github.com/go-vgo/robotgo v0.110.8 // indirect
13+
github.com/godbus/dbus/v5 v5.1.0 // indirect
14+
github.com/jezek/xgb v1.1.1 // indirect
15+
github.com/kbinani/screenshot v0.0.0-20250624051815-089614a94018 // indirect
16+
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect
17+
github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
18+
github.com/manifoldco/promptui v0.9.0 // indirect
19+
github.com/otiai10/gosseract v2.2.1+incompatible // indirect
20+
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
21+
github.com/robotn/xgb v0.10.0 // indirect
22+
github.com/robotn/xgbutil v0.10.0 // indirect
23+
github.com/shirou/gopsutil/v4 v4.25.4 // indirect
24+
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 // indirect
25+
github.com/tklauser/go-sysconf v0.3.15 // indirect
26+
github.com/tklauser/numcpus v0.10.0 // indirect
27+
github.com/vcaesar/gops v0.41.0 // indirect
28+
github.com/vcaesar/imgo v0.41.0 // indirect
29+
github.com/vcaesar/keycode v0.10.1 // indirect
30+
github.com/vcaesar/screenshot v0.11.1 // indirect
31+
github.com/vcaesar/tt v0.20.1 // indirect
32+
github.com/yusufpapurcu/wmi v1.2.4 // indirect
33+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
34+
golang.org/x/image v0.27.0 // indirect
35+
golang.org/x/sys v0.33.0 // indirect
36+
)

go.sum

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc h1:w3fW4b1hPf6/cfdQQ/vu9V8eBeQmuLZIaUMj81nIzYQ=
2+
github.com/AllenDang/w32 v0.0.0-20180428130237-ad0a36d80adc/go.mod h1:1rHKulT5eD2DzdKxDXUZRKtBfkTzLmTL42ZmEmOfyrs=
3+
github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
4+
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
5+
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
6+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
7+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
8+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
9+
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
10+
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
11+
github.com/ebitengine/purego v0.8.3 h1:K+0AjQp63JEZTEMZiwsI9g0+hAMNohwUOtY0RPGexmc=
12+
github.com/ebitengine/purego v0.8.3/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
13+
github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ=
14+
github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA=
15+
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
16+
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
17+
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
18+
github.com/go-vgo/robotgo v0.110.8 h1:tWoUyqlZgDJ61bQju3WGSb/NIIfNV4TkYL3GFeWcHio=
19+
github.com/go-vgo/robotgo v0.110.8/go.mod h1:45w33PzprtFncpw4cAt9SzMtSY9XnVfotu+RrCVN8JE=
20+
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
21+
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
22+
github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
23+
github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
24+
github.com/kbinani/screenshot v0.0.0-20250624051815-089614a94018 h1:NQYgMY188uWrS+E/7xMVpydsI48PMHcc7SfR4OxkDF4=
25+
github.com/kbinani/screenshot v0.0.0-20250624051815-089614a94018/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ=
26+
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc=
27+
github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
28+
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
29+
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
30+
github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
31+
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
32+
github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
33+
github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
34+
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
35+
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
36+
github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
37+
github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM=
38+
github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
39+
github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw=
40+
github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
41+
github.com/shirou/gopsutil/v4 v4.25.4 h1:cdtFO363VEOOFrUCjZRh4XVJkb548lyF0q0uTeMqYPw=
42+
github.com/shirou/gopsutil/v4 v4.25.4/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA=
43+
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog=
44+
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
45+
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
46+
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
47+
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
48+
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
49+
github.com/vcaesar/gops v0.41.0 h1:FG748Jyw3FOuZnbzSgB+CQSx2e5LbLCPWV2JU1brFdc=
50+
github.com/vcaesar/gops v0.41.0/go.mod h1:/3048L7Rj7QjQKTSB+kKc7hDm63YhTWy5QJ10TCP37A=
51+
github.com/vcaesar/imgo v0.41.0 h1:kNLYGrThXhB9Dd6IwFmfPnxq9P6yat2g7dpPjr7OWO8=
52+
github.com/vcaesar/imgo v0.41.0/go.mod h1:/LGOge8etlzaVu/7l+UfhJxR6QqaoX5yeuzGIMfWb4I=
53+
github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw=
54+
github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ=
55+
github.com/vcaesar/screenshot v0.11.1 h1:GgPuN89XC4Yh38dLx4quPlSo3YiWWhwIria/j3LtrqU=
56+
github.com/vcaesar/screenshot v0.11.1/go.mod h1:gJNwHBiP1v1v7i8TQ4yV1XJtcyn2I/OJL7OziVQkwjs=
57+
github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4=
58+
github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU=
59+
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
60+
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
61+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
62+
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
63+
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
64+
golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g=
65+
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
66+
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
67+
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
68+
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
69+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
70+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
71+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=

main.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"image/png"
6+
"os"
7+
"time"
8+
9+
"github.com/manifoldco/promptui"
10+
"github.com/vcaesar/screenshot"
11+
)
12+
13+
14+
15+
func main() {
16+
fmt.Println(`
17+
________/\\\\\\\\\__________________________________________________________
18+
_____/\\\////////___________________________________________________________
19+
___/\\\/____________________________/\\\\\\\\\______/\\\____________________
20+
__/\\\______________/\\\\\\\\\_____/\\\/////\\\__/\\\\\\\\\\\__/\\/\\\\\\\__
21+
_\/\\\_____________\////////\\\___\/\\\\\\\\\\__\////\\\////__\/\\\/////\\\_
22+
_\//\\\______________/\\\\\\\\\\__\/\\\//////______\/\\\______\/\\\___\///__
23+
__\///\\\___________/\\\/////\\\__\/\\\____________\/\\\_/\\__\/\\\_________
24+
____\////\\\\\\\\\_\//\\\\\\\\/\\_\/\\\____________\//\\\\\___\/\\\_________
25+
_______\/////////___\////////\//__\///______________\/////____\///__________
26+
27+
`)
28+
29+
capture_ops := []string{"Record full screen", "Record specific window", "Screenshot specific window", "Screenshot full screen"}
30+
prompt := promptui.Select{
31+
Label: "Select Action",
32+
Items: capture_ops,
33+
HideSelected: true,
34+
}
35+
36+
i, _, err := prompt.Run()
37+
if err != nil {
38+
fmt.Print("Action Cancelled.")
39+
return
40+
}
41+
42+
switch i {
43+
case 3:
44+
Screenshot_Display()
45+
}
46+
}

ssdisplay.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"image/png"
6+
"os"
7+
"time"
8+
9+
"github.com/manifoldco/promptui"
10+
"github.com/vcaesar/screenshot"
11+
)
12+
13+
func TakeScreenshot(fileName string, displayNum int) {
14+
img, err := screenshot.CaptureDisplay(displayNum)
15+
if err != nil {
16+
fmt.Print("Error: ", err)
17+
return
18+
}
19+
file, _ := os.Create(fileName)
20+
defer file.Close()
21+
png.Encode(file, img)
22+
}
23+
24+
func Screenshot_Display() {
25+
userHomeDir, _ := os.UserHomeDir()
26+
active_displays := screenshot.NumActiveDisplays()
27+
if active_displays == 1 {
28+
bounds := screenshot.GetDisplayBounds(0)
29+
fileName := fmt.Sprintf("%s\\Desktop\\Screenshot_%s_%dx%d.png", userHomeDir, time.Now().Format("20060102_150405"), bounds.Dx(), bounds.Dy())
30+
TakeScreenshot(fileName, 0)
31+
fmt.Printf("Screenshot saved at %s", fileName)
32+
}
33+
displays := []string{"Screenshot all displays", "Display 1 (Primary)"}
34+
for i := 2; i < active_displays; i++ {
35+
displays = append(displays, fmt.Sprintf("Display %d", i))
36+
}
37+
prompt := promptui.Select{
38+
Label: "Select Display",
39+
Items: displays,
40+
}
41+
42+
display, _, err := prompt.Run()
43+
if err != nil {
44+
fmt.Print("Some error occurred")
45+
}
46+
switch display {
47+
case 0:
48+
for i := range active_displays {
49+
bounds := screenshot.GetDisplayBounds(0)
50+
fileName := fmt.Sprintf("%s\\Desktop\\Screenshot_Disp%d_%s_%dx%d.png", userHomeDir, i, time.Now().Format("20060102_150405"), bounds.Dx(), bounds.Dy())
51+
TakeScreenshot(fileName, i)
52+
fmt.Printf("Screenshot saved at %s", fileName)
53+
}
54+
case 1:
55+
bounds := screenshot.GetDisplayBounds(0)
56+
fileName := fmt.Sprintf("%s\\Desktop\\Screenshot_%s_%dx%d.png", userHomeDir, time.Now().Format("20060102_150405"), bounds.Dx(), bounds.Dy())
57+
TakeScreenshot(fileName, 0)
58+
fmt.Printf("Screenshot saved at %s", fileName)
59+
default:
60+
bounds := screenshot.GetDisplayBounds(display - 1)
61+
fileName := fmt.Sprintf("%s\\Desktop\\Screenshot_Disp%d_%s_%dx%d.png", userHomeDir, display, time.Now().Format("20060102_150405"), bounds.Dx(), bounds.Dy())
62+
TakeScreenshot(fileName, display-1)
63+
fmt.Printf("Screenshot saved at %s", fileName)
64+
}
65+
}

sswindow.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
import "github.com/go-vgo/robotgo"
4+
5+
func Screenshot_Window() {
6+
robotgo
7+
}

0 commit comments

Comments
 (0)