erm/vendor/github.com/lxn/win/shell32.go
2021-07-30 23:29:20 +01:00

495 lines
13 KiB
Go

// Copyright 2010 The win Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build windows
package win
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type CSIDL uint32
type HDROP HANDLE
const (
CSIDL_DESKTOP = 0x00
CSIDL_INTERNET = 0x01
CSIDL_PROGRAMS = 0x02
CSIDL_CONTROLS = 0x03
CSIDL_PRINTERS = 0x04
CSIDL_PERSONAL = 0x05
CSIDL_FAVORITES = 0x06
CSIDL_STARTUP = 0x07
CSIDL_RECENT = 0x08
CSIDL_SENDTO = 0x09
CSIDL_BITBUCKET = 0x0A
CSIDL_STARTMENU = 0x0B
CSIDL_MYDOCUMENTS = 0x0C
CSIDL_MYMUSIC = 0x0D
CSIDL_MYVIDEO = 0x0E
CSIDL_DESKTOPDIRECTORY = 0x10
CSIDL_DRIVES = 0x11
CSIDL_NETWORK = 0x12
CSIDL_NETHOOD = 0x13
CSIDL_FONTS = 0x14
CSIDL_TEMPLATES = 0x15
CSIDL_COMMON_STARTMENU = 0x16
CSIDL_COMMON_PROGRAMS = 0x17
CSIDL_COMMON_STARTUP = 0x18
CSIDL_COMMON_DESKTOPDIRECTORY = 0x19
CSIDL_APPDATA = 0x1A
CSIDL_PRINTHOOD = 0x1B
CSIDL_LOCAL_APPDATA = 0x1C
CSIDL_ALTSTARTUP = 0x1D
CSIDL_COMMON_ALTSTARTUP = 0x1E
CSIDL_COMMON_FAVORITES = 0x1F
CSIDL_INTERNET_CACHE = 0x20
CSIDL_COOKIES = 0x21
CSIDL_HISTORY = 0x22
CSIDL_COMMON_APPDATA = 0x23
CSIDL_WINDOWS = 0x24
CSIDL_SYSTEM = 0x25
CSIDL_PROGRAM_FILES = 0x26
CSIDL_MYPICTURES = 0x27
CSIDL_PROFILE = 0x28
CSIDL_SYSTEMX86 = 0x29
CSIDL_PROGRAM_FILESX86 = 0x2A
CSIDL_PROGRAM_FILES_COMMON = 0x2B
CSIDL_PROGRAM_FILES_COMMONX86 = 0x2C
CSIDL_COMMON_TEMPLATES = 0x2D
CSIDL_COMMON_DOCUMENTS = 0x2E
CSIDL_COMMON_ADMINTOOLS = 0x2F
CSIDL_ADMINTOOLS = 0x30
CSIDL_CONNECTIONS = 0x31
CSIDL_COMMON_MUSIC = 0x35
CSIDL_COMMON_PICTURES = 0x36
CSIDL_COMMON_VIDEO = 0x37
CSIDL_RESOURCES = 0x38
CSIDL_RESOURCES_LOCALIZED = 0x39
CSIDL_COMMON_OEM_LINKS = 0x3A
CSIDL_CDBURN_AREA = 0x3B
CSIDL_COMPUTERSNEARME = 0x3D
CSIDL_FLAG_CREATE = 0x8000
CSIDL_FLAG_DONT_VERIFY = 0x4000
CSIDL_FLAG_NO_ALIAS = 0x1000
CSIDL_FLAG_PER_USER_INIT = 0x8000
CSIDL_FLAG_MASK = 0xFF00
)
// NotifyIcon flags
const (
NIF_MESSAGE = 0x00000001
NIF_ICON = 0x00000002
NIF_TIP = 0x00000004
NIF_STATE = 0x00000008
NIF_INFO = 0x00000010
NIF_GUID = 0x00000020
NIF_REALTIME = 0x00000040
NIF_SHOWTIP = 0x00000080
)
// NotifyIcon messages
const (
NIM_ADD = 0x00000000
NIM_MODIFY = 0x00000001
NIM_DELETE = 0x00000002
NIM_SETFOCUS = 0x00000003
NIM_SETVERSION = 0x00000004
)
// NotifyIcon states
const (
NIS_HIDDEN = 0x00000001
NIS_SHAREDICON = 0x00000002
)
// NotifyIcon info flags
const (
NIIF_NONE = 0x00000000
NIIF_INFO = 0x00000001
NIIF_WARNING = 0x00000002
NIIF_ERROR = 0x00000003
NIIF_USER = 0x00000004
NIIF_NOSOUND = 0x00000010
NIIF_LARGE_ICON = 0x00000020
NIIF_RESPECT_QUIET_TIME = 0x00000080
)
// NotifyIcon notifications
const (
NIN_SELECT = WM_USER + 0
NIN_KEYSELECT = WM_USER + 1
NIN_BALLOONSHOW = WM_USER + 2
NIN_BALLOONHIDE = WM_USER + 3
NIN_BALLOONTIMEOUT = WM_USER + 4
NIN_BALLOONUSERCLICK = WM_USER + 5
NIN_POPUPOPEN = WM_USER + 6
NIN_POPUPCLOSE = WM_USER + 7
)
// NotifyIcon versions
const (
NOTIFYICON_VERSION = 3
NOTIFYICON_VERSION_4 = 4
)
// SHGetFileInfo flags
const (
SHGFI_LARGEICON = 0x000000000
SHGFI_SMALLICON = 0x000000001
SHGFI_OPENICON = 0x000000002
SHGFI_SHELLICONSIZE = 0x000000004
SHGFI_PIDL = 0x000000008
SHGFI_USEFILEATTRIBUTES = 0x000000010
SHGFI_ADDOVERLAYS = 0x000000020
SHGFI_OVERLAYINDEX = 0x000000040
SHGFI_ICON = 0x000000100
SHGFI_DISPLAYNAME = 0x000000200
SHGFI_TYPENAME = 0x000000400
SHGFI_ATTRIBUTES = 0x000000800
SHGFI_ICONLOCATION = 0x000001000
SHGFI_EXETYPE = 0x000002000
SHGFI_SYSICONINDEX = 0x000004000
SHGFI_LINKOVERLAY = 0x000008000
SHGFI_SELECTED = 0x000010000
SHGFI_ATTR_SPECIFIED = 0x000020000
)
// SHGetStockIconInfo flags
const (
SHGSI_ICONLOCATION = 0
SHGSI_ICON = 0x000000100
SHGSI_SYSICONINDEX = 0x000004000
SHGSI_LINKOVERLAY = 0x000008000
SHGSI_SELECTED = 0x000010000
SHGSI_LARGEICON = 0x000000000
SHGSI_SMALLICON = 0x000000001
SHGSI_SHELLICONSIZE = 0x000000004
)
// SHSTOCKICONID values
const (
SIID_DOCNOASSOC = 0
SIID_DOCASSOC = 1
SIID_APPLICATION = 2
SIID_FOLDER = 3
SIID_FOLDEROPEN = 4
SIID_DRIVE525 = 5
SIID_DRIVE35 = 6
SIID_DRIVEREMOVE = 7
SIID_DRIVEFIXED = 8
SIID_DRIVENET = 9
SIID_DRIVENETDISABLED = 10
SIID_DRIVECD = 11
SIID_DRIVERAM = 12
SIID_WORLD = 13
SIID_SERVER = 15
SIID_PRINTER = 16
SIID_MYNETWORK = 17
SIID_FIND = 22
SIID_HELP = 23
SIID_SHARE = 28
SIID_LINK = 29
SIID_SLOWFILE = 30
SIID_RECYCLER = 31
SIID_RECYCLERFULL = 32
SIID_MEDIACDAUDIO = 40
SIID_LOCK = 47
SIID_AUTOLIST = 49
SIID_PRINTERNET = 50
SIID_SERVERSHARE = 51
SIID_PRINTERFAX = 52
SIID_PRINTERFAXNET = 53
SIID_PRINTERFILE = 54
SIID_STACK = 55
SIID_MEDIASVCD = 56
SIID_STUFFEDFOLDER = 57
SIID_DRIVEUNKNOWN = 58
SIID_DRIVEDVD = 59
SIID_MEDIADVD = 60
SIID_MEDIADVDRAM = 61
SIID_MEDIADVDRW = 62
SIID_MEDIADVDR = 63
SIID_MEDIADVDROM = 64
SIID_MEDIACDAUDIOPLUS = 65
SIID_MEDIACDRW = 66
SIID_MEDIACDR = 67
SIID_MEDIACDBURN = 68
SIID_MEDIABLANKCD = 69
SIID_MEDIACDROM = 70
SIID_AUDIOFILES = 71
SIID_IMAGEFILES = 72
SIID_VIDEOFILES = 73
SIID_MIXEDFILES = 74
SIID_FOLDERBACK = 75
SIID_FOLDERFRONT = 76
SIID_SHIELD = 77
SIID_WARNING = 78
SIID_INFO = 79
SIID_ERROR = 80
SIID_KEY = 81
SIID_SOFTWARE = 82
SIID_RENAME = 83
SIID_DELETE = 84
SIID_MEDIAAUDIODVD = 85
SIID_MEDIAMOVIEDVD = 86
SIID_MEDIAENHANCEDCD = 87
SIID_MEDIAENHANCEDDVD = 88
SIID_MEDIAHDDVD = 89
SIID_MEDIABLURAY = 90
SIID_MEDIAVCD = 91
SIID_MEDIADVDPLUSR = 92
SIID_MEDIADVDPLUSRW = 93
SIID_DESKTOPPC = 94
SIID_MOBILEPC = 95
SIID_USERS = 96
SIID_MEDIASMARTMEDIA = 97
SIID_MEDIACOMPACTFLASH = 98
SIID_DEVICECELLPHONE = 99
SIID_DEVICECAMERA = 100
SIID_DEVICEVIDEOCAMERA = 101
SIID_DEVICEAUDIOPLAYER = 102
SIID_NETWORKCONNECT = 103
SIID_INTERNET = 104
SIID_ZIPFILE = 105
SIID_SETTINGS = 106
SIID_DRIVEHDDVD = 132
SIID_DRIVEBD = 133
SIID_MEDIAHDDVDROM = 134
SIID_MEDIAHDDVDR = 135
SIID_MEDIAHDDVDRAM = 136
SIID_MEDIABDROM = 137
SIID_MEDIABDR = 138
SIID_MEDIABDRE = 139
SIID_CLUSTEREDDRIVE = 140
SIID_MAX_ICONS = 175
)
type NOTIFYICONDATA struct {
CbSize uint32
HWnd HWND
UID uint32
UFlags uint32
UCallbackMessage uint32
HIcon HICON
SzTip [128]uint16
DwState uint32
DwStateMask uint32
SzInfo [256]uint16
UVersion uint32
SzInfoTitle [64]uint16
DwInfoFlags uint32
GuidItem syscall.GUID
HBalloonIcon HICON
}
type SHFILEINFO struct {
HIcon HICON
IIcon int32
DwAttributes uint32
SzDisplayName [MAX_PATH]uint16
SzTypeName [80]uint16
}
type BROWSEINFO struct {
HwndOwner HWND
PidlRoot uintptr
PszDisplayName *uint16
LpszTitle *uint16
UlFlags uint32
Lpfn uintptr
LParam uintptr
IImage int32
}
type SHSTOCKICONINFO struct {
CbSize uint32
HIcon HICON
ISysImageIndex int32
IIcon int32
SzPath [MAX_PATH]uint16
}
var (
// Library
libshell32 *windows.LazyDLL
// Functions
dragAcceptFiles *windows.LazyProc
dragFinish *windows.LazyProc
dragQueryFile *windows.LazyProc
extractIcon *windows.LazyProc
shBrowseForFolder *windows.LazyProc
shDefExtractIcon *windows.LazyProc
shGetFileInfo *windows.LazyProc
shGetPathFromIDList *windows.LazyProc
shGetSpecialFolderPath *windows.LazyProc
shParseDisplayName *windows.LazyProc
shGetStockIconInfo *windows.LazyProc
shellExecute *windows.LazyProc
shell_NotifyIcon *windows.LazyProc
)
func init() {
// Library
libshell32 = windows.NewLazySystemDLL("shell32.dll")
// Functions
dragAcceptFiles = libshell32.NewProc("DragAcceptFiles")
dragFinish = libshell32.NewProc("DragFinish")
dragQueryFile = libshell32.NewProc("DragQueryFileW")
extractIcon = libshell32.NewProc("ExtractIconW")
shBrowseForFolder = libshell32.NewProc("SHBrowseForFolderW")
shDefExtractIcon = libshell32.NewProc("SHDefExtractIconW")
shGetFileInfo = libshell32.NewProc("SHGetFileInfoW")
shGetPathFromIDList = libshell32.NewProc("SHGetPathFromIDListW")
shGetSpecialFolderPath = libshell32.NewProc("SHGetSpecialFolderPathW")
shGetStockIconInfo = libshell32.NewProc("SHGetStockIconInfo")
shellExecute = libshell32.NewProc("ShellExecuteW")
shell_NotifyIcon = libshell32.NewProc("Shell_NotifyIconW")
shParseDisplayName = libshell32.NewProc("SHParseDisplayName")
}
func DragAcceptFiles(hWnd HWND, fAccept bool) bool {
ret, _, _ := syscall.Syscall(dragAcceptFiles.Addr(), 2,
uintptr(hWnd),
uintptr(BoolToBOOL(fAccept)),
0)
return ret != 0
}
func DragQueryFile(hDrop HDROP, iFile uint, lpszFile *uint16, cch uint) uint {
ret, _, _ := syscall.Syscall6(dragQueryFile.Addr(), 4,
uintptr(hDrop),
uintptr(iFile),
uintptr(unsafe.Pointer(lpszFile)),
uintptr(cch),
0,
0)
return uint(ret)
}
func DragFinish(hDrop HDROP) {
syscall.Syscall(dragAcceptFiles.Addr(), 1,
uintptr(hDrop),
0,
0)
}
func ExtractIcon(hInst HINSTANCE, exeFileName *uint16, iconIndex int32) HICON {
ret, _, _ := syscall.Syscall(extractIcon.Addr(), 3,
uintptr(hInst),
uintptr(unsafe.Pointer(exeFileName)),
uintptr(iconIndex))
return HICON(ret)
}
func SHBrowseForFolder(lpbi *BROWSEINFO) uintptr {
ret, _, _ := syscall.Syscall(shBrowseForFolder.Addr(), 1,
uintptr(unsafe.Pointer(lpbi)),
0,
0)
return ret
}
func SHDefExtractIcon(pszIconFile *uint16, iIndex int32, uFlags uint32, phiconLarge, phiconSmall *HICON, nIconSize uint32) HRESULT {
ret, _, _ := syscall.Syscall6(shDefExtractIcon.Addr(), 6,
uintptr(unsafe.Pointer(pszIconFile)),
uintptr(iIndex),
uintptr(uFlags),
uintptr(unsafe.Pointer(phiconLarge)),
uintptr(unsafe.Pointer(phiconSmall)),
uintptr(nIconSize))
return HRESULT(ret)
}
func SHGetFileInfo(pszPath *uint16, dwFileAttributes uint32, psfi *SHFILEINFO, cbFileInfo, uFlags uint32) uintptr {
ret, _, _ := syscall.Syscall6(shGetFileInfo.Addr(), 5,
uintptr(unsafe.Pointer(pszPath)),
uintptr(dwFileAttributes),
uintptr(unsafe.Pointer(psfi)),
uintptr(cbFileInfo),
uintptr(uFlags),
0)
return ret
}
func SHGetPathFromIDList(pidl uintptr, pszPath *uint16) bool {
ret, _, _ := syscall.Syscall(shGetPathFromIDList.Addr(), 2,
pidl,
uintptr(unsafe.Pointer(pszPath)),
0)
return ret != 0
}
func SHGetSpecialFolderPath(hwndOwner HWND, lpszPath *uint16, csidl CSIDL, fCreate bool) bool {
ret, _, _ := syscall.Syscall6(shGetSpecialFolderPath.Addr(), 4,
uintptr(hwndOwner),
uintptr(unsafe.Pointer(lpszPath)),
uintptr(csidl),
uintptr(BoolToBOOL(fCreate)),
0,
0)
return ret != 0
}
func SHParseDisplayName(pszName *uint16, pbc uintptr, ppidl *uintptr, sfgaoIn uint32, psfgaoOut *uint32) HRESULT {
ret, _, _ := syscall.Syscall6(shParseDisplayName.Addr(), 5,
uintptr(unsafe.Pointer(pszName)),
pbc,
uintptr(unsafe.Pointer(ppidl)),
0,
uintptr(unsafe.Pointer(psfgaoOut)),
0)
return HRESULT(ret)
}
func SHGetStockIconInfo(stockIconId int32, uFlags uint32, stockIcon *SHSTOCKICONINFO) HRESULT {
if shGetStockIconInfo.Find() != nil {
return HRESULT(0)
}
ret, _, _ := syscall.Syscall6(shGetStockIconInfo.Addr(), 3,
uintptr(stockIconId),
uintptr(uFlags),
uintptr(unsafe.Pointer(stockIcon)),
0,
0,
0,
)
return HRESULT(ret)
}
func ShellExecute(hWnd HWND, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int) bool {
ret, _, _ := syscall.Syscall6(shellExecute.Addr(), 6,
uintptr(hWnd),
uintptr(unsafe.Pointer(verb)),
uintptr(unsafe.Pointer(file)),
uintptr(unsafe.Pointer(args)),
uintptr(unsafe.Pointer(cwd)),
uintptr(showCmd),
)
return ret != 0
}
func Shell_NotifyIcon(dwMessage uint32, lpdata *NOTIFYICONDATA) bool {
ret, _, _ := syscall.Syscall(shell_NotifyIcon.Addr(), 2,
uintptr(dwMessage),
uintptr(unsafe.Pointer(lpdata)),
0)
return ret != 0
}