title: 【轉載】golang 設置桌面壁紙
date: 2021-07-06 11:14:45
comment: false
toc: true
category:
- Golang
tags: - 轉載
- Go
- golang
- 設置
- 桌面
- 壁紙
本文轉載自:golang 設置桌面壁紙 - Go 語言中文網 - Golang 中文社區 & Golang 版更換 windows 壁紙為 bing 每日背景圖 - Go 語言中文網 - Golang 中文社區
版本 1#
golang 語言編寫,設置 windows 桌面壁紙,圖片來自於必應網站(cn.bing.com)
github 源碼地址:https://github.com/tujiaw/gowallpaper
有興趣的 Star 一下吧
編譯好的程序:https://pan.baidu.com/s/1l5OW9GeuUF0r5TFaBWkWZg (提取碼:pcqh)
直接雙擊運行,顯示如下:
設置微軟必應的壁紙,用法如下:
day - 每天更新壁紙
now - 設置當天壁紙
prev - 設置前一天壁紙
next - 設置後一天壁紙
rand - 間隔隨機切換壁紙(如每分鐘切換壁紙:rand 1m)
quit - 退出
#
golang 調用 windows API#
package winapi
import (
"log"
"syscall"
"unsafe"
)
var ApiList = map[string][]string {
"user32.dll": {
"MessageBoxW",
"SystemParametersInfoW",
},
"kernel32.dll": {
},
}
var ProcCache map[string]*syscall.Proc
func init() {
ProcCache = make(map[string]*syscall.Proc)
for dllName, apiList := range ApiList {
d, err := syscall.LoadDLL(dllName)
if err != nil {
panic(err)
}
for _, name := range apiList {
api, err := d.FindProc(name)
if err != nil {
log.Println(err, name)
}
ProcCache[name] = api
}
_ = syscall.FreeLibrary(d.Handle)
}
}
func WinCall(name string, a ...uintptr) {
if api, ok := ProcCache[name]; ok {
_, _, err := api.Call(a...)
if err != nil {
log.Println(err)
}
} else {
log.Println("api not found, name:", name)
}
}
func IntPtr(n int) uintptr {
return uintptr(n)
}
func StrPtr(s string) uintptr {
p, _ := syscall.UTF16PtrFromString(s)
return uintptr(unsafe.Pointer(p))
}
func ShowMessage(title, text string) {
WinCall("MessageBoxW", IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}
func SetWallpaper(bmpPath string) {
WinCall("SystemParametersInfoW", IntPtr(20), IntPtr(0), StrPtr(bmpPath), IntPtr(3))
}
版本 2#
直接從 bing 搜索首頁獲取圖片鏈接,修改鏈接中的大小,獲取圖片,調用 windows 的 dll 設置桌面背景圖
package main
import (
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"github.com/antchfx/htmlquery"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"regexp"
"strings"
"syscall"
"time"
"unsafe"
)
const (
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
BingHomeURL = "https://cn.bing.com"
CurrentPathDir = "cache/"
)
const (
Size1k string = "1920,1080"
Size2k string = "2560,1440"
Size4k string = "3840,2160"
)
// ImageSize 圖片大小
type ImageSize struct {
w string
h string
}
func init() {
_ = os.Mkdir(CurrentPathDir, 0755)
}
// EncodeMD5 MD5編碼
func EncodeMD5(value string) string {
m := md5.New()
m.Write([]byte(value))
return hex.EncodeToString(m.Sum(nil))
}
// SetWindowsWallpaper 設置windows壁紙
func SetWindowsWallpaper(imagePath string) error {
dll := syscall.NewLazyDLL("user32.dll")
proc := dll.NewProc("SystemParametersInfoW")
_t, _ := syscall.UTF16PtrFromString(imagePath)
ret, _, _ := proc.Call(20, 1, uintptr(unsafe.Pointer(_t)), 0x1|0x2)
if ret != 1 {
return errors.New("系統調用失敗")
}
return nil
}
// GetBingBackgroundImageURL 獲取bing首頁的背景圖片鏈接
func GetBingBackgroundImageURL() (string, error) {
client := http.Client{}
request, err := http.NewRequest("GET", BingHomeURL, nil)
if err != nil {
return "", err
}
request.Header.Set("user-agent", UserAgent)
response, err := client.Do(request)
if err != nil {
return "", err
}
htmlDoc, err := htmlquery.Parse(response.Body)
if err != nil {
return "", err
}
item := htmlquery.FindOne(htmlDoc, "//div[@id=\"bgImgProgLoad\"]")
result := htmlquery.SelectAttr(item, "data-ultra-definition-src")
return BingHomeURL + result, nil
}
// DownloadImage 下載圖片,保存並返回保存的文件名的絕對路徑
func DownloadImage(imageURL string, size *ImageSize) (string, error) {
wRegexp := regexp.MustCompile("w=\\d+")
hRegexp := regexp.MustCompile("h=\\d+")
imageURL = wRegexp.ReplaceAllString(imageURL, "w="+size.w)
imageURL = hRegexp.ReplaceAllString(imageURL, "h="+size.h)
client := http.Client{}
request, err := http.NewRequest("GET", imageURL, nil)
if err != nil {
return "", err
}
response, err := client.Do(request)
if err != nil {
return "", err
}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
day := time.Now().Format("2006-01-02")
fileName := EncodeMD5(imageURL)
path := CurrentPathDir + fmt.Sprintf("[%sx%s][%s]%s", size.w, size.h, day, fileName) + ".jpg"
err = ioutil.WriteFile(path, body, 0755)
if err != nil {
return "", err
}
absPath, err := filepath.Abs(path)
if err != nil {
return "", err
}
return absPath, nil
}
func main() {
fmt.Println("獲取必應背景圖中...")
imageURL, err := GetBingBackgroundImageURL()
if err != nil {
fmt.Println("獲取背景圖片鏈接失敗: " + err.Error())
return
}
fmt.Println("獲取成功: " + imageURL)
fmt.Println("下載圖片...")
imagePath, err := DownloadImage(imageURL, &ImageSize{
w: strings.Split(Size4k, ",")[0],
h: strings.Split(Size4k, ",")[1],
})
if err != nil {
fmt.Println("下載圖片失敗: " + err.Error())
return
}
fmt.Println("設置桌面...")
err = SetWindowsWallpaper(imagePath)
if err != nil {
fmt.Println("設置桌面背景失敗: " + err.Error())
return
}
}
我的版本#
package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"regexp"
"strings"
"syscall"
"time"
"unsafe"
"github.com/antchfx/htmlquery"
)
func main() {
// fmt.Println("獲取必應背景圖中...")
// imageURL, err := GetBingBackgroundImageURL()
// if err != nil {
// fmt.Println("獲取背景圖片鏈接失敗: " + err.Error())
// return
// }
// fmt.Println("獲取成功: " + imageURL)
fmt.Println("下載圖片...")
imagePath, err := DownloadImage(computerMobilePhoneAdaptiveRandomPicture, &ImageSize{
w: strings.Split(Size4k, ",")[0],
h: strings.Split(Size4k, ",")[1],
})
if err != nil {
fmt.Println("下載圖片失敗: " + err.Error())
return
}
fmt.Println("設置桌面...")
err = SetWindowsWallpaper(imagePath)
if err != nil {
fmt.Println("設置桌面背景失敗: " + err.Error())
return
}
}
const (
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
BingHomeURL = "https://cn.bing.com"
CurrentPathDir = "cache/"
RandBingImgURL = "https://img.tjit.net/bing/rand/"
// 電腦手機自適應隨機圖片
computerMobilePhoneAdaptiveRandomPicture = "https://img.tjit.net/bing/rand/"
)
const (
Size1k string = "1920,1080"
Size2k string = "2560,1440"
Size4k string = "3840,2160"
)
// ImageSize 圖片大小
type ImageSize struct {
w string
h string
}
func init() {
_ = os.Mkdir(CurrentPathDir, 0755)
}
// EncodeMD5 MD5編碼
func EncodeMD5(value string) string {
m := md5.New()
m.Write([]byte(value))
return hex.EncodeToString(m.Sum(nil))
}
// SetWindowsWallpaper 設置windows壁紙
func SetWindowsWallpaper(imagePath string) error {
dll := syscall.NewLazyDLL("user32.dll")
proc := dll.NewProc("SystemParametersInfoW")
_t, _ := syscall.UTF16PtrFromString(imagePath)
ret, _, _ := proc.Call(20, 1, uintptr(unsafe.Pointer(_t)), 0x1|0x2)
if ret != 1 {
return errors.New("系統調用失敗")
}
return nil
}
// GetBingBackgroundImageURL 獲取bing首頁的背景圖片鏈接
func GetBingBackgroundImageURL() (string, error) {
client := http.Client{}
request, err := http.NewRequest("GET", BingHomeURL, nil)
if err != nil {
return "", err
}
request.Header.Set("user-agent", UserAgent)
response, err := client.Do(request)
if err != nil {
return "", err
}
bodyRes, err := ioutil.ReadAll(response.Body)
body := ioutil.NopCloser(bytes.NewReader(bodyRes))
body1 := ioutil.NopCloser(bytes.NewReader(bodyRes))
htmlDoc, err := htmlquery.Parse(body)
if err != nil {
return "", err
}
all, err := ioutil.ReadAll(body1)
s := string(all)
fmt.Println(s)
item := htmlquery.FindOne(htmlDoc, "//div[@id=\"bgImgProgLoad\"]")
result := htmlquery.SelectAttr(item, "data-ultra-definition-src")
return BingHomeURL + result, nil
}
// DownloadImage 下載圖片,保存並返回保存的文件名的絕對路徑
func DownloadImage(imageURL string, size *ImageSize) (string, error) {
wRegexp := regexp.MustCompile("w=\\d+")
hRegexp := regexp.MustCompile("h=\\d+")
imageURL = wRegexp.ReplaceAllString(imageURL, "w="+size.w)
imageURL = hRegexp.ReplaceAllString(imageURL, "h="+size.h)
client := http.Client{}
request, err := http.NewRequest("GET", imageURL, nil)
if err != nil {
return "", err
}
response, err := client.Do(request)
if err != nil {
return "", err
}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
day := time.Now().Format("2006-01-02")
fileName := EncodeMD5(imageURL)
path := CurrentPathDir + fmt.Sprintf("[%sx%s][%s]%s", size.w, size.h, day, fileName) + ".jpg"
err = ioutil.WriteFile(path, body, 0755)
if err != nil {
return "", err
}
absPath, err := filepath.Abs(path)
if err != nil {
return "", err
}
return absPath, nil
}