Files
u-desktop/win32.go
绝尘 9fd3acede3 新增: 星座运势+AI资讯+知识卡片+桌面设置窗口+秒显示开关
- 星座运势: 天聚数行API集成,5维进度条+幸运标签+今日概述
- AI资讯: 天聚数行API,图文布局5条展示,文件缓存2小时刷新
- 知识卡片: AI生成,关键字+提示词配置,30分钟刷新
- 桌面设置: 独立WebView2窗口,760x1350,含壁纸/布局/城市/颜色等配置
- 显示控制: 壁纸/时间/天气/星座/知识/AI资讯独立开关,秒显示开关
- 文件缓存: 星座运势+AI资讯缓存到本地,启动即显示上次数据
- initDone防抖: 防止设置窗口初始化触发卡片重载
2026-05-26 04:34:00 +08:00

88 lines
2.7 KiB
Go

package main
import (
"log"
"unsafe"
"github.com/jchv/go-webview2"
"golang.org/x/sys/windows"
)
var (
user32 = windows.NewLazySystemDLL("user32.dll")
procFindWindowW = user32.NewProc("FindWindowW")
procFindWindowExW = user32.NewProc("FindWindowExW")
procSendMessageTimeoutW = user32.NewProc("SendMessageTimeoutW")
procSetParent = user32.NewProc("SetParent")
procGetForegroundWindow = user32.NewProc("GetForegroundWindow")
procGetWindowRect = user32.NewProc("GetWindowRect")
procGetSystemMetrics = user32.NewProc("GetSystemMetrics")
procMoveWindow = user32.NewProc("MoveWindow")
procShowWindow = user32.NewProc("ShowWindow")
procSetProcessDPIAware = user32.NewProc("SetProcessDPIAware")
procSetWindowLongPtrW = user32.NewProc("SetWindowLongPtrW")
procGetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW")
procGetDpiForWindow = user32.NewProc("GetDpiForWindow")
procGetClientRect = user32.NewProc("GetClientRect")
procGetMessageW = user32.NewProc("GetMessageW")
procPostMessageW = user32.NewProc("PostMessageW")
procTranslateMessage = user32.NewProc("TranslateMessage")
procDispatchMessageW = user32.NewProc("DispatchMessageW")
)
var wv webview2.WebView
var wvHwnd uintptr
var jsQueue = make(chan string, 64)
var paused int32
const wmEvalJS = 0x0401
const wmSetHtml = 0x0402
var htmlQueue = make(chan string, 1)
func evalJS(js string) {
select {
case jsQueue <- js:
log.Println("evalJS queued:", js[:min(len(js), 60)])
default:
log.Println("jsQueue full, dropping eval")
}
if wvHwnd != 0 {
procPostMessageW.Call(wvHwnd, wmEvalJS, 0, 0)
}
}
func findWorkerW() uintptr {
progman, _, _ := procFindWindowW.Call(
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr("Progman"))), 0)
if progman == 0 {
return 0
}
var result uintptr
procSendMessageTimeoutW.Call(progman, 0x052C, 0, 0, 0x0000, 1000, uintptr(unsafe.Pointer(&result)))
shellDefView, _, _ := procFindWindowExW.Call(progman, 0,
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr("SHELLDLL_DefView"))), 0)
workerwAfterShell, _, _ := procFindWindowExW.Call(progman, shellDefView,
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr("WorkerW"))), 0)
if workerwAfterShell != 0 {
return workerwAfterShell
}
ww, _, _ := procFindWindowExW.Call(progman, 0,
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr("WorkerW"))), 0)
return ww
}
func getDPI(hwnd uintptr) int {
dpi, _, _ := procGetDpiForWindow.Call(hwnd)
if dpi == 0 {
return 96
}
return int(dpi)
}
func getScreenSize() (int32, int32) {
w, _, _ := procGetSystemMetrics.Call(0)
h, _, _ := procGetSystemMetrics.Call(1)
return int32(w), int32(h)
}