Initial GoWallpaper implementation
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
//go:build windows
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
"golang.org/x/sys/windows/registry"
|
||||
)
|
||||
|
||||
const (
|
||||
spiSetDesktopWallpaper = 0x0014
|
||||
spifUpdateINIFile = 0x0001
|
||||
spifSendChange = 0x0002
|
||||
)
|
||||
|
||||
var (
|
||||
user32 = windows.NewLazySystemDLL("user32.dll")
|
||||
procSystemParametersInfoW = user32.NewProc("SystemParametersInfoW")
|
||||
)
|
||||
|
||||
func validWallpaperStyle(style string) bool {
|
||||
switch style {
|
||||
case "keep", "fill", "fit", "stretch", "tile", "center", "span":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func setWallpaper(path, style string) error {
|
||||
absPath, err := filepath.Abs(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if style != "keep" {
|
||||
if err := setWallpaperStyle(style); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
pathPtr, err := windows.UTF16PtrFromString(absPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r1, _, callErr := procSystemParametersInfoW.Call(
|
||||
spiSetDesktopWallpaper,
|
||||
0,
|
||||
uintptr(unsafe.Pointer(pathPtr)),
|
||||
spifUpdateINIFile|spifSendChange,
|
||||
)
|
||||
if r1 == 0 {
|
||||
if callErr != nil && !errors.Is(callErr, windows.ERROR_SUCCESS) {
|
||||
return fmt.Errorf("调用 Windows 壁纸接口: %w", callErr)
|
||||
}
|
||||
return errors.New("Windows 拒绝设置壁纸")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func setWallpaperStyle(style string) error {
|
||||
values := map[string][2]string{
|
||||
"fill": {"10", "0"},
|
||||
"fit": {"6", "0"},
|
||||
"stretch": {"2", "0"},
|
||||
"tile": {"0", "1"},
|
||||
"center": {"0", "0"},
|
||||
"span": {"22", "0"},
|
||||
}
|
||||
value, ok := values[style]
|
||||
if !ok {
|
||||
return fmt.Errorf("不支持的壁纸显示方式: %s", style)
|
||||
}
|
||||
key, err := registry.OpenKey(registry.CURRENT_USER, `Control Panel\Desktop`, registry.SET_VALUE)
|
||||
if err != nil {
|
||||
return fmt.Errorf("打开壁纸设置: %w", err)
|
||||
}
|
||||
defer key.Close()
|
||||
if err := key.SetStringValue("WallpaperStyle", value[0]); err != nil {
|
||||
return fmt.Errorf("设置壁纸样式: %w", err)
|
||||
}
|
||||
if err := key.SetStringValue("TileWallpaper", value[1]); err != nil {
|
||||
return fmt.Errorf("设置壁纸平铺方式: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user