5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 20:51:38 +08:00
wails/v3/pkg/w32/taskbar.go
2025-04-26 18:48:27 -07:00

96 lines
2.4 KiB
Go

//go:build windows
package w32
import (
"syscall"
"unsafe"
)
var (
CLSID_TaskbarList = syscall.GUID{Data1: 0x56FDF344, Data2: 0xFD6D, Data3: 0x11D0, Data4: [8]byte{0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}}
IID_ITaskbarList3 = syscall.GUID{Data1: 0xEA1AFB91, Data2: 0x9E28, Data3: 0x4B86, Data4: [8]byte{0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF}}
)
// ITaskbarList3 interface for Windows taskbar functionality
type ITaskbarList3 struct {
lpVtbl *taskbarList3Vtbl
}
type taskbarList3Vtbl struct {
QueryInterface uintptr
AddRef uintptr
Release uintptr
HrInit uintptr
AddTab uintptr
DeleteTab uintptr
ActivateTab uintptr
SetActiveAlt uintptr
MarkFullscreenWindow uintptr
SetProgressValue uintptr
SetProgressState uintptr
RegisterTab uintptr
UnregisterTab uintptr
SetTabOrder uintptr
SetTabActive uintptr
ThumbBarAddButtons uintptr
ThumbBarUpdateButtons uintptr
ThumbBarSetImageList uintptr
SetOverlayIcon uintptr
SetThumbnailTooltip uintptr
SetThumbnailClip uintptr
}
// NewTaskbarList3 creates a new instance of ITaskbarList3
func NewTaskbarList3() (*ITaskbarList3, error) {
const COINIT_APARTMENTTHREADED = 0x2
if hrInit := CoInitializeEx(COINIT_APARTMENTTHREADED); hrInit != 0 && hrInit != 0x1 {
return nil, syscall.Errno(hrInit)
}
var taskbar *ITaskbarList3
hr := CoCreateInstance(
&CLSID_TaskbarList,
CLSCTX_INPROC_SERVER,
&IID_ITaskbarList3,
uintptr(unsafe.Pointer(&taskbar)),
)
if hr != 0 {
CoUninitialize()
return nil, syscall.Errno(hr)
}
if r, _, _ := syscall.SyscallN(taskbar.lpVtbl.HrInit, uintptr(unsafe.Pointer(taskbar))); r != 0 {
syscall.SyscallN(taskbar.lpVtbl.Release, uintptr(unsafe.Pointer(taskbar)))
CoUninitialize()
return nil, syscall.Errno(r)
}
return taskbar, nil
}
// SetOverlayIcon sets an overlay icon on the taskbar
func (t *ITaskbarList3) SetOverlayIcon(hwnd HWND, hIcon HICON, description *uint16) error {
ret, _, _ := syscall.SyscallN(
t.lpVtbl.SetOverlayIcon,
uintptr(unsafe.Pointer(t)),
uintptr(hwnd),
uintptr(hIcon),
uintptr(unsafe.Pointer(description)),
)
if ret != 0 {
return syscall.Errno(ret)
}
return nil
}
// Release releases the ITaskbarList3 interface
func (t *ITaskbarList3) Release() {
if t != nil {
syscall.SyscallN(t.lpVtbl.Release, uintptr(unsafe.Pointer(t)))
CoUninitialize()
}
}