You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:45:03