495 lines
13 KiB
Go
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
|
|
}
|