mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 20:51:38 +08:00
96 lines
2.4 KiB
Go
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()
|
|
}
|
|
}
|