新增: 壁纸切换(主题/本地图片/Bing/纯色渐变)

This commit is contained in:
2026-05-25 19:54:32 +08:00
parent a804db3579
commit bb1574641f
14 changed files with 868 additions and 395 deletions

119
dialog.go Normal file
View File

@@ -0,0 +1,119 @@
package main
import (
"fmt"
"unicode/utf16"
"unsafe"
"golang.org/x/sys/windows"
)
var (
comdlg32 = windows.NewLazySystemDLL("comdlg32.dll")
procGetOpenFileNameW = comdlg32.NewProc("GetOpenFileNameW")
procChooseColorW = comdlg32.NewProc("ChooseColorW")
)
func slicePtr(s interface{}) uintptr {
switch v := s.(type) {
case []uint16:
if len(v) == 0 { return 0 }
return uintptr(unsafe.Pointer(&v[0]))
case []uint32:
if len(v) == 0 { return 0 }
return uintptr(unsafe.Pointer(&v[0]))
}
return 0
}
func openFileDialog(owner uintptr) string {
type openFileName struct {
lStructSize uint32
hwndOwner uintptr
hInstance uintptr
lpstrFilter uintptr
lpstrCustomFilter uintptr
nMaxCustFilter uint32
nFilterIndex uint32
lpstrFile uintptr
nMaxFile uint32
lpstrFileTitle uintptr
nMaxFileTitle uint32
lpstrInitialDir uintptr
lpstrTitle uintptr
Flags uint32
nFileOffset uint16
nFileExtension uint16
lpstrDefExt uintptr
lCustData uintptr
lpfnHook uintptr
lpTemplateName uintptr
pvReserved uintptr
dwReserved uint32
FlagsEx uint32
}
// Filter: "Images\0*.jpg;*.png\0All\0*.*\0\0"
filterStr := "图片文件\x00*.jpg;*.jpeg;*.png;*.bmp;*.webp;*.gif\x00所有文件\x00*.*\x00\x00"
filterUTF16 := utf16.Encode([]rune(filterStr))
titleUTF16 := utf16.Encode([]rune("选择壁纸图片"))
fileBuf := make([]uint16, 260)
ofn := openFileName{
lStructSize: uint32(unsafe.Sizeof(openFileName{})),
hwndOwner: owner,
lpstrFilter: slicePtr(filterUTF16),
lpstrFile: slicePtr(fileBuf),
nMaxFile: 260,
lpstrTitle: slicePtr(titleUTF16),
Flags: 0x00001000 | 0x00000800 | 0x00000004,
}
ret, _, _ := procGetOpenFileNameW.Call(uintptr(unsafe.Pointer(&ofn)))
if ret == 0 {
return ""
}
return windows.UTF16ToString(fileBuf)
}
func colorPickerDialog(owner uintptr, initialColor string) string {
type chooseColor struct {
lStructSize uint32
hwndOwner uintptr
hInstance uintptr
rgbResult uint32
lpCustColors uintptr
Flags uint32
lCustData uintptr
lpfnHook uintptr
lpTemplateName uintptr
}
custColors := make([]uint32, 16)
var initRGB uint32
if len(initialColor) > 4 && initialColor[0] == '#' {
var r, g, b uint32
fmt.Sscanf(initialColor[1:], "%02x%02x%02x", &r, &g, &b)
initRGB = r | (g << 8) | (b << 16)
}
cc := chooseColor{
lStructSize: uint32(unsafe.Sizeof(chooseColor{})),
hwndOwner: owner,
rgbResult: initRGB,
lpCustColors: slicePtr(custColors),
Flags: 0x00000002,
}
ret, _, _ := procChooseColorW.Call(uintptr(unsafe.Pointer(&cc)))
if ret == 0 {
return ""
}
r := cc.rgbResult & 0xFF
g := (cc.rgbResult >> 8) & 0xFF
b := (cc.rgbResult >> 16) & 0xFF
return fmt.Sprintf("#%02x%02x%02x", r, g, b)
}