Windows 10下使用Go开发如何自定义WebView窗口及任务栏显示图标
这个需求完全可以实现,Windows平台下通过调用Win32 API修改WebView窗口对应HWND的图标即可完成,以下是具体实现方案:
实现原理
你使用的webview库在Windows平台底层依赖Edge WebView2,窗口句柄可以通过w.Window()方法直接获取,拿到HWND后调用Win32的SendMessage发送WM_SETICON消息,分别设置大图标(任务栏显示)和小图标(窗口左上角显示)即可。
完整代码示例
//go:build windows package main import ( "syscall" "unsafe" "github.com/webview/webview" ) // Win32 API 常量定义 const ( WM_SETICON = 0x0080 ICON_SMALL = 0 ICON_BIG = 1 LR_LOADFROMFILE = 0x00000010 LR_DEFAULTSIZE = 0x00000040 ) // 加载Win32动态库方法 var ( user32 = syscall.NewLazyDLL("user32.dll") loadImageProc = user32.NewProc("LoadImageW") sendMessageProc = user32.NewProc("SendMessageW") ) // 自定义设置窗口图标方法 func SetWindowIcon(hwnd syscall.Handle, icoPath string) error { // 加载标题栏小图标(常规尺寸16*16) smallIcon, _, err := loadImageProc.Call( 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(icoPath))), 1, // 标记加载的资源为图标类型 16, 16, LR_LOADFROMFILE|LR_DEFAULTSIZE, ) if smallIcon == 0 { return err } // 加载任务栏大图标(常规尺寸32*32) bigIcon, _, err := loadImageProc.Call( 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(icoPath))), 1, 32, 32, LR_LOADFROMFILE|LR_DEFAULTSIZE, ) if bigIcon == 0 { return err } // 发送消息给窗口设置图标 sendMessageProc.Call(uintptr(hwnd), WM_SETICON, ICON_SMALL, smallIcon) sendMessageProc.Call(uintptr(hwnd), WM_SETICON, ICON_BIG, bigIcon) return nil } func main() { debug := true w := webview.New(debug) defer w.Destroy() w.SetTitle("Settings") w.SetSize(800, 600, webview.HintNone) // 调用自定义方法设置图标 err := SetWindowIcon(w.Window().(syscall.Handle), "/assets/icon.ico") if err != nil { // 此处可自行添加错误处理逻辑 println("图标设置失败:", err.Error()) } w.Navigate(url) w.Run() }
补充说明
如果你需要复用已经通过goversioninfo嵌入到程序里的应用图标,不需要读取外部ico文件,把LoadImage换成LoadIcon从程序资源加载即可,性能更好也不需要额外携带独立ico文件。
内容的提问来源于stack exchange,提问作者PrecisionPete
相关产品推荐
相关产品推荐

