设置桌面背景和屏幕保护

主要是修改注册表和使用windows api来生效配置,支持XP以上操作系统。

使用方法

参数说明:
Usage of setbg.exe:
-a 设置开启或关闭屏幕保护,默认是true
-b 设置桌面背景图路径
-p 设置屏幕保护在恢复时显示登录屏幕
-s 设置屏幕保护文件路径
-style 设置桌面背景位置
-t 设置屏幕保护等待时间

设置桌面背景和屏幕保护例子:
(vista or later):
setbg.exe -b %USERPROFILE%\Desktop\test.jpg -s C:\WINDOWS\system32\Bubbles.scr -t 10 -p true

XP/2003:
setbg.exe -b %USERPROFILE%\桌面\test.jpg -s C:\WINDOWS\system32\ssstars.scr -t 20 -p true

关闭屏幕保护:
setbg.exe -a=false

注册表

桌面背景注册表 HKEY_CURRENT_USER\Control Panel\Desktop 修改字符串 Wallpaper
名称:Wallpaper
值 :C:\windows\Web\Wallpaper\Lenovo\LenovoWallPaper.jpg

屏幕保护注册表 HKEY_CURRENT_USER\Control Panel\Desktop 下新增字符串
名称:SCRNSAVE.EXE
值 :C:\WINDOWS\system32\Bubbles.scr

示例代码

用到的库:

  • github.com/golang/sys/windows/registry
  • golang.org/x/image/bmp

下载

  • go get -u -v github.com/golang/sys
  • go get -u -v github.com/golang/image

下载后把sys和image复制到golang.org/x目录下。

main.go

package mainimport ("errors""flag""image/jpeg""log""os""path/filepath""github.com/golang/sys/windows/registry""golang.org/x/image/bmp"
)type WallpaperStyle uintfunc (wps WallpaperStyle) String() string {return wallpaperStyles[wps]
}const (Fill    WallpaperStyle = iota // 填充Fit                           // 适应Stretch                       // 拉伸Tile                          // 平铺Center                        // 居中Cross                         // 跨区)var wallpaperStyles = map[WallpaperStyle]string{ 0: "填充", 1: "适应", 2: "拉伸", 3: "平铺", 4: "居中", 5: "跨区"}var (bgFile       stringbgStyle      intsFile        stringwaitTime     intactiveScreen boolpasswd       bool
)var (regist registry.Key
)func init() {flag.StringVar(&bgFile, "b", "", "set bg file path.")flag.IntVar(&bgStyle, "style", 2, "set desktop WallpaperStyle")flag.BoolVar(&activeScreen, "a", true, "set screen active.")flag.StringVar(&sFile, "s", "", "set screen save file path.")flag.IntVar(&waitTime, "t", 0, "set screen save wait time.")flag.BoolVar(&passwd, "p", true, "sets whether the screen saver requires the user to enter a password to display the Windows desktop. ")}func main() {flag.Parse()var err errorregist, err = registry.OpenKey(registry.CURRENT_USER, `Control Panel\Desktop`, registry.ALL_ACCESS)checkErr(err)defer regist.Close()// 设置桌面背景if bgFile != "" {style := WallpaperStyle(bgStyle)if bgStyle < 0 || bgStyle > 5 {style = Stretch}setDesktopWallpaper(bgFile, style)log.Printf("设置桌面背景和位置 --> %s, %s\n", bgFile, style)}ok := getScreenSaver()log.Printf("获取屏幕保护开关 --> %t\n", ok)// 关闭屏幕保护if ok && !activeScreen {regist.DeleteValue("SCRNSAVE.EXE")log.Println("关闭屏幕保护")return}// 设置屏幕保护if sFile != "" && activeScreen {err = regist.SetStringValue("SCRNSAVE.EXE", sFile)checkErr(err)setScreenSaver(SPI_SETSCREENSAVEACTIVE, TRUE)log.Printf("设置屏幕保护 --> %s\n", sFile)ok = getScreenSaver()}if ok {// 设置屏幕保护时间if waitTime > 0 {setScreenSaver(SPI_SETSCREENSAVETIMEOUT, uint32(60*waitTime))log.Printf("设置屏幕保护等待时间 --> %d分钟\n", waitTime)}// 设置屏幕保护 在恢复时使用密码var (passwdSwitch stringpasswdBool   uint32)if passwd {passwdSwitch = "1"passwdBool = TRUE} else {passwdSwitch = "0"passwdBool = FALSE}// XP / server 2003setRegistString("ScreenSaverIsSecure", passwdSwitch)// vista or laterif checkVersion() {setScreenSaver(SPI_SETSCREENSAVESECURE, passwdBool)}log.Printf("设置屏幕保护恢复时是否使用密码 --> %t\n", passwd)}
}func checkErr(err error) {if err != nil {log.Fatal(err)}
}// http://blog.csdn.net/kfysck/article/details/8153264
// Check that the OS is Vista or later (Vista is v6.0).
func checkVersion() bool {version := GetVersion()major := version & 0xFFif major < 6 {return false}return true
}// jpg转换为bmp
func ConvertedWallpaper(bgfile string) string {file, err := os.Open(bgfile)checkErr(err)defer file.Close()img, err := jpeg.Decode(file) //解码checkErr(err)bmpPath := os.Getenv("USERPROFILE") + `\Local Settings\Application Data\Microsoft\Wallpaper1.bmp`bmpfile, err := os.Create(bmpPath)checkErr(err)defer bmpfile.Close()err = bmp.Encode(bmpfile, img)checkErr(err)return bmpPath
}func setDesktopWallpaper(bgFile string, style WallpaperStyle) error {ext := filepath.Ext(bgFile)// vista 以下的系统需要转换jpg为bmp(xp、2003)if !checkVersion() && ext != ".bmp" {setRegistString("ConvertedWallpaper", bgFile)bgFile = ConvertedWallpaper(bgFile)}// 设置桌面背景setRegistString("Wallpaper", bgFile)/* 设置壁纸风格和展开方式在Control Panel\Desktop中的两个键值将被设置TileWallpaper0: 图片不被平铺1: 被平铺WallpaperStyle0:  0表示图片居中,1表示平铺2:  拉伸填充整个屏幕6:  拉伸适应屏幕并保持高度比10: 图片被调整大小裁剪适应屏幕保持纵横比22: 跨区*/var bgTileWallpaper, bgWallpaperStyle stringbgTileWallpaper = "0"switch style {case Fill: // (Windows 7 or later)bgWallpaperStyle = "10"case Fit: // (Windows 7 or later)bgWallpaperStyle = "6"case Stretch:bgWallpaperStyle = "2"case Tile:bgTileWallpaper = "1"bgWallpaperStyle = "0"case Center:bgWallpaperStyle = "0"case Cross: // win10 or laterbgWallpaperStyle = "22"}setRegistString("WallpaperStyle", bgWallpaperStyle)setRegistString("TileWallpaper", bgTileWallpaper)ok := SystemParametersInfo(SPI_SETDESKWALLPAPER, FALSE, nil, SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE)if !ok {return errors.New("Desktop background Settings fail.")}return nil
}func setRegistString(name, value string) {err := regist.SetStringValue(name, value)checkErr(err)
}func setScreenSaver(uiAction, uiParam uint32) {ok := SystemParametersInfo(uiAction, uiParam, nil, SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE)if !ok {log.Fatal("Screen saver Settings fail.")}
}func getScreenSaver() bool {_, _, err := regist.GetStringValue("SCRNSAVE.EXE")if err != nil {return false}return true
}

win.go

package mainimport ("syscall""unsafe"
)const (// 获取屏幕保护开关SPI_GETSCREENSAVEACTIVE = 0x0010// 设置屏保开关SPI_SETSCREENSAVEACTIVE = 0x0011// 设置屏保等待时间SPI_SETSCREENSAVETIMEOUT = 0x000F// 设备屏保在恢复时显示屏幕SPI_SETSCREENSAVESECURE = 0x0077// 设置桌面背景SPI_SETDESKWALLPAPER = 0x0014// Writes the new system-wide parameter setting to the user profile.SPIF_UPDATEINIFILE = 1// Broadcasts the WM_SETTINGCHANGE message after updating the user profile.SPIF_SENDWININICHANGE = 2FALSE = 0TRUE  = 1
)var (// Librarylibuser32   uintptrlibkernel32 uintptr// FunctionssystemParametersInfo uintptrgetVersion           uintptr
)func init() {// Librarylibuser32 = MustLoadLibrary("user32.dll")libkernel32 = MustLoadLibrary("kernel32.dll")// FunctionssystemParametersInfo = MustGetProcAddress(libuser32, "SystemParametersInfoW")getVersion = MustGetProcAddress(libkernel32, "GetVersion")
}func MustLoadLibrary(name string) uintptr {lib, err := syscall.LoadLibrary(name)if err != nil {panic(err)}return uintptr(lib)
}func MustGetProcAddress(lib uintptr, name string) uintptr {addr, err := syscall.GetProcAddress(syscall.Handle(lib), name)if err != nil {panic(err)}return uintptr(addr)
}/* 通过调用Win32 API函数SystemParametersInfo 设置桌面壁纸
之前我们已经设置了壁纸的类型,但是壁纸图片的实际文件路径还没设置。SystemParametersInfo 这个函数位于user32.dll中,它支持我们从系统中获得硬件和配置信息。它有四个参数,第一个指明调用这个函数所要执行的操作,接下来的两个参数指明将要设置的数据,依据第一个参数的设定。最后一个允许指定改变是否被保存。这里第一个参数我们应指定SPI_SETDESKWALLPAPER,指明我们是要设置壁纸。接下来是文件路径。在Vista之前必须是一个.bmp的文件。Vista和更高级的系统支持.jpg格式。
SPI_SETDESKWALLPAPER参数使得壁纸改变保存并持续可见。
*/
func SystemParametersInfo(uiAction, uiParam uint32, pvParam unsafe.Pointer, fWinIni uint32) bool {ret, _, _ := syscall.Syscall6(systemParametersInfo, 4,uintptr(uiAction),uintptr(uiParam),uintptr(pvParam),uintptr(fWinIni), 0, 0)return ret != 0
}func GetVersion() int64 {ret, _, _ := syscall.Syscall(getVersion, 0, 0, 0, 0)return int64(ret)
}func stringToPointer(str string) unsafe.Pointer {return unsafe.Pointer(syscall.StringToUTF16Ptr(str))
}

golang windows 设置桌面背景和屏幕保护相关推荐

  1. 计算机主题和桌面背景区别,xp系统主题,桌面背景,屏幕保护,分辨率等技巧设置...

    XP系统是大家平时用的最多的,通过对XP显示技巧设置,可以打造自己的个性化电脑桌面,一般来说设置的多的是系统主题,桌面背景,屏幕保护程序,分辨率设置,屏幕刷新率这些. 1.电脑主题设置:首先 右击电脑 ...

  2. 如何给计算机设置桌面背景步骤6,怎么设置电脑桌面背景呢

    一.教学目标 知识方面: 1.掌握设置桌面图案的方法.2.掌握设置屏幕保护的方法.3.学会选择除windows自带的背景之外的其他图片作背景. 技能方面: 1.培养学生的自学能力和实际操作能力.2. ...

  3. 【转】XP/2000无法使用“缩略图查看”、右键无“设置桌面背景”选项问题详解...

    许多朋友在XP或2000系统下查看图片时,经常碰到以下几个问题: 1. 当我查看文件夹里面的图片,以缩略图方式查看时,却发现系统不能显示图片内容了,只是出来一个简单的图片图标(就和我们以图标或平铺显示 ...

  4. 设置文字为计算机屏幕保护,win10系统设置炫酷三维文字屏幕保护的具体技巧

    有关win10系统设置炫酷三维文字屏幕保护的操作方法想必大家有所耳闻.但是能够对win10系统设置炫酷三维文字屏幕保护进行实际操作的人却不多.其实解决win10系统设置炫酷三维文字屏幕保护的问题也不是 ...

  5. Ubuntu设置桌面背景

    由于之前接触的是windows,而ubuntu有些地方和windows的操作类似,所以设置桌面背景很容易 一.先上网下载几个适合自己分辨率的图片. 双击图片,系统会自动打开图片,我的是用"G ...

  6. android 背景图片自适应屏幕大小,android 设置桌面背景图片适应屏幕大小

    今天做demo,设置桌面每天自动更新背景,但是桌面的背景都是被系统裁剪过的图片,上网百度了一下,有个过时的方法,改进后果然有用了! Bitmap bmp=BitmapFactory.decodeRes ...

  7. 启动远程计算机的屏保,远程桌面能使用屏幕保护吗

    第一步:首先是在Windows XP上安装SP2正式版,按照常规方式安装即可,这里不再赘述. 第二步:准备一份版本较早的SP2终端服务器软件(据说从Build 2082开始该功能就被禁止了,所以最好使 ...

  8. linux熄屏时间设置,linux xset 关闭屏幕保护-关闭节电模式

    由于工作较忙,随性更新.admin@stgod.com linux机器运行一个监控程序,需要显示器一直亮着,不能黑屏,不能进入省电模式. 系统中没有安装gnome的电源管理程序,也没有安装屏幕保护程序 ...

  9. golang常用设置——修改背景

    golang打开后默认背景为黑色,很伤眼睛.我们修改为白色背景,设置位置如下:

最新文章

  1. libevent和libev的区别对比(二)
  2. 根据对方提供的URL获取返回的数据流并保存为XML
  3. 牛客 - maki和tree(dfs)
  4. ModuleNotFoundError: No module named 'djqscsv'
  5. C语言试题三十三之比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。
  6. 软件配置管理(六)常用配置软件配置工具指令
  7. 使用Classycle验证类/包依赖关系
  8. 基础管理薄弱服装企业如何实施ERP
  9. springboot配置手动提交_Spring Boot 入门教程 | 图文讲解
  10. wordpress制作主题之菜单
  11. 充分的准备是成功的关键因素
  12. 阿里云物联网平台如何通过云产品流转使两个设备互相通信
  13. Spring Cloud之赵国的覆灭
  14. 美国大大学计算机排名2015,2015年美国计算机专业大学排名TOP20
  15. 微软放弃收购雅虎的提议
  16. 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
  17. html图片自然,PS制作自然逼真物体倒影图片效果
  18. 刚刚,北大智能学院成立!AI视觉泰斗朱松纯教授任院长
  19. Markdown初体验
  20. mysql云架构设计_MySQL云数据库架构设计实践 洪斌@爱可生

热门文章

  1. 期望风险最小化、经验风险最小化、结构风险最小化
  2. SSO单点登录-基于cookie的单点登录
  3. 应用ceph块存储(ceph-13.2.10)
  4. 大数据面试题(一)----HADOOP 面试题
  5. Python 进阶(七): Word 基本操作
  6. BUUCTF_Crypto题目题解记录1
  7. 入手评测 联想小新Pro 16怎么样?
  8. c#根据年月获取所有日期集合、根据年份计算总周数,根据年份和周数获取一周的开始及结束时间
  9. 关于SE54视图簇的创建和维护
  10. The superclass javax.servlet.http.HttpServlet was not found on the Java Buid Path