-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathhicon.go
102 lines (90 loc) · 2.93 KB
/
hicon.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package wingo
import (
proc2 "github.com/rogeecn/wingo/proc"
"runtime"
"syscall"
"unsafe"
"github.com/rogeecn/wingo/errco"
)
// A handle to an icon.
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types#hicon
type HICON HANDLE
// ⚠️ You must defer HICON.DestroyIcon().
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createiconindirect
func CreateIconIndirect(info *ICONINFO) HICON {
ret, _, err := syscall.Syscall(proc2.CreateIconIndirect.Addr(), 1,
uintptr(unsafe.Pointer(info)), 0, 0)
if ret == 0 {
panic(errco.ERROR(err))
}
return HICON(ret)
}
// Extracts all icons: big and small.
//
// ⚠️ You must defer HICON.DestroyIcon() on each icon returned in both slices.
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-extracticonexw
func ExtractIconEx(fileName string) (largeIcons, smallIcons []HICON) {
lpszFile16 := Str.ToNativeSlice(fileName)
retrieveIdx := -1
ret, _, err := syscall.Syscall6(proc2.ExtractIconEx.Addr(), 5,
uintptr(unsafe.Pointer(&lpszFile16[0])), uintptr(retrieveIdx), 0, 0, 0, 0)
if ret == _UINT_MAX {
panic(errco.ERROR(err))
}
numIcons := int(ret)
largeIcons = make([]HICON, numIcons)
smallIcons = make([]HICON, numIcons)
ret, _, err = syscall.Syscall6(proc2.ExtractIconEx.Addr(), 5,
uintptr(unsafe.Pointer(&lpszFile16[0])), 0,
uintptr(unsafe.Pointer(&largeIcons[0])),
uintptr(unsafe.Pointer(&smallIcons[0])),
uintptr(numIcons), 0)
runtime.KeepAlive(lpszFile16)
if ret == _UINT_MAX {
panic(errco.ERROR(err))
}
return
}
// ⚠️ You must defer HICON.DestroyIcon().
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-copyicon
func (hIcon HICON) CopyIcon() HICON {
ret, _, err := syscall.Syscall(proc2.CopyIcon.Addr(), 1,
uintptr(hIcon), 0, 0)
if ret == 0 {
panic(errco.ERROR(err))
}
return HICON(ret)
}
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-destroyicon
func (hIcon HICON) DestroyIcon() {
ret, _, err := syscall.Syscall(proc2.DestroyIcon.Addr(), 1,
uintptr(hIcon), 0, 0)
if ret == 0 {
panic(errco.ERROR(err))
}
}
// ⚠️ You must defer HBITMAP.DeleteObject() in HbmMask and HbmColor fields.
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-geticoninfo
func (hIcon HICON) GetIconInfo(iconInfo *ICONINFO) {
ret, _, err := syscall.Syscall(proc2.GetIconInfo.Addr(), 2,
uintptr(hIcon), uintptr(unsafe.Pointer(iconInfo)), 0)
if ret == 0 {
panic(errco.ERROR(err))
}
}
// ⚠️ You must defer HBITMAP.DeleteObject() in HbmMask and HbmColor fields.
//
// 📑 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-geticoninfoexw
func (hIcon HICON) GetIconInfoEx(iconInfoEx *ICONINFOEX) {
iconInfoEx.SetCbSize() // safety
ret, _, err := syscall.Syscall(proc2.GetIconInfoEx.Addr(), 2,
uintptr(hIcon), uintptr(unsafe.Pointer(iconInfoEx)), 0)
if ret == 0 {
panic(errco.ERROR(err))
}
}