go-tg-screenshot-bot
494 строки · 13.2 Кб
1// Copyright 2010 The win Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build windows
6
7package win8
9import (10"golang.org/x/sys/windows"11"syscall"12"unsafe"13)
14
15type CSIDL uint3216type HDROP HANDLE17
18const (19CSIDL_DESKTOP = 0x0020CSIDL_INTERNET = 0x0121CSIDL_PROGRAMS = 0x0222CSIDL_CONTROLS = 0x0323CSIDL_PRINTERS = 0x0424CSIDL_PERSONAL = 0x0525CSIDL_FAVORITES = 0x0626CSIDL_STARTUP = 0x0727CSIDL_RECENT = 0x0828CSIDL_SENDTO = 0x0929CSIDL_BITBUCKET = 0x0A30CSIDL_STARTMENU = 0x0B31CSIDL_MYDOCUMENTS = 0x0C32CSIDL_MYMUSIC = 0x0D33CSIDL_MYVIDEO = 0x0E34CSIDL_DESKTOPDIRECTORY = 0x1035CSIDL_DRIVES = 0x1136CSIDL_NETWORK = 0x1237CSIDL_NETHOOD = 0x1338CSIDL_FONTS = 0x1439CSIDL_TEMPLATES = 0x1540CSIDL_COMMON_STARTMENU = 0x1641CSIDL_COMMON_PROGRAMS = 0x1742CSIDL_COMMON_STARTUP = 0x1843CSIDL_COMMON_DESKTOPDIRECTORY = 0x1944CSIDL_APPDATA = 0x1A45CSIDL_PRINTHOOD = 0x1B46CSIDL_LOCAL_APPDATA = 0x1C47CSIDL_ALTSTARTUP = 0x1D48CSIDL_COMMON_ALTSTARTUP = 0x1E49CSIDL_COMMON_FAVORITES = 0x1F50CSIDL_INTERNET_CACHE = 0x2051CSIDL_COOKIES = 0x2152CSIDL_HISTORY = 0x2253CSIDL_COMMON_APPDATA = 0x2354CSIDL_WINDOWS = 0x2455CSIDL_SYSTEM = 0x2556CSIDL_PROGRAM_FILES = 0x2657CSIDL_MYPICTURES = 0x2758CSIDL_PROFILE = 0x2859CSIDL_SYSTEMX86 = 0x2960CSIDL_PROGRAM_FILESX86 = 0x2A61CSIDL_PROGRAM_FILES_COMMON = 0x2B62CSIDL_PROGRAM_FILES_COMMONX86 = 0x2C63CSIDL_COMMON_TEMPLATES = 0x2D64CSIDL_COMMON_DOCUMENTS = 0x2E65CSIDL_COMMON_ADMINTOOLS = 0x2F66CSIDL_ADMINTOOLS = 0x3067CSIDL_CONNECTIONS = 0x3168CSIDL_COMMON_MUSIC = 0x3569CSIDL_COMMON_PICTURES = 0x3670CSIDL_COMMON_VIDEO = 0x3771CSIDL_RESOURCES = 0x3872CSIDL_RESOURCES_LOCALIZED = 0x3973CSIDL_COMMON_OEM_LINKS = 0x3A74CSIDL_CDBURN_AREA = 0x3B75CSIDL_COMPUTERSNEARME = 0x3D76CSIDL_FLAG_CREATE = 0x800077CSIDL_FLAG_DONT_VERIFY = 0x400078CSIDL_FLAG_NO_ALIAS = 0x100079CSIDL_FLAG_PER_USER_INIT = 0x800080CSIDL_FLAG_MASK = 0xFF0081)
82
83// NotifyIcon flags
84const (85NIF_MESSAGE = 0x0000000186NIF_ICON = 0x0000000287NIF_TIP = 0x0000000488NIF_STATE = 0x0000000889NIF_INFO = 0x0000001090NIF_GUID = 0x0000002091NIF_REALTIME = 0x0000004092NIF_SHOWTIP = 0x0000008093)
94
95// NotifyIcon messages
96const (97NIM_ADD = 0x0000000098NIM_MODIFY = 0x0000000199NIM_DELETE = 0x00000002100NIM_SETFOCUS = 0x00000003101NIM_SETVERSION = 0x00000004102)
103
104// NotifyIcon states
105const (106NIS_HIDDEN = 0x00000001107NIS_SHAREDICON = 0x00000002108)
109
110// NotifyIcon info flags
111const (112NIIF_NONE = 0x00000000113NIIF_INFO = 0x00000001114NIIF_WARNING = 0x00000002115NIIF_ERROR = 0x00000003116NIIF_USER = 0x00000004117NIIF_NOSOUND = 0x00000010118NIIF_LARGE_ICON = 0x00000020119NIIF_RESPECT_QUIET_TIME = 0x00000080120)
121
122// NotifyIcon notifications
123const (124NIN_SELECT = WM_USER + 0125NIN_KEYSELECT = WM_USER + 1126NIN_BALLOONSHOW = WM_USER + 2127NIN_BALLOONHIDE = WM_USER + 3128NIN_BALLOONTIMEOUT = WM_USER + 4129NIN_BALLOONUSERCLICK = WM_USER + 5130NIN_POPUPOPEN = WM_USER + 6131NIN_POPUPCLOSE = WM_USER + 7132)
133
134// NotifyIcon versions
135const (136NOTIFYICON_VERSION = 3137NOTIFYICON_VERSION_4 = 4138)
139
140// SHGetFileInfo flags
141const (142SHGFI_LARGEICON = 0x000000000143SHGFI_SMALLICON = 0x000000001144SHGFI_OPENICON = 0x000000002145SHGFI_SHELLICONSIZE = 0x000000004146SHGFI_PIDL = 0x000000008147SHGFI_USEFILEATTRIBUTES = 0x000000010148SHGFI_ADDOVERLAYS = 0x000000020149SHGFI_OVERLAYINDEX = 0x000000040150SHGFI_ICON = 0x000000100151SHGFI_DISPLAYNAME = 0x000000200152SHGFI_TYPENAME = 0x000000400153SHGFI_ATTRIBUTES = 0x000000800154SHGFI_ICONLOCATION = 0x000001000155SHGFI_EXETYPE = 0x000002000156SHGFI_SYSICONINDEX = 0x000004000157SHGFI_LINKOVERLAY = 0x000008000158SHGFI_SELECTED = 0x000010000159SHGFI_ATTR_SPECIFIED = 0x000020000160)
161
162// SHGetStockIconInfo flags
163const (164SHGSI_ICONLOCATION = 0165SHGSI_ICON = 0x000000100166SHGSI_SYSICONINDEX = 0x000004000167SHGSI_LINKOVERLAY = 0x000008000168SHGSI_SELECTED = 0x000010000169SHGSI_LARGEICON = 0x000000000170SHGSI_SMALLICON = 0x000000001171SHGSI_SHELLICONSIZE = 0x000000004172)
173
174// SHSTOCKICONID values
175const (176SIID_DOCNOASSOC = 0177SIID_DOCASSOC = 1178SIID_APPLICATION = 2179SIID_FOLDER = 3180SIID_FOLDEROPEN = 4181SIID_DRIVE525 = 5182SIID_DRIVE35 = 6183SIID_DRIVEREMOVE = 7184SIID_DRIVEFIXED = 8185SIID_DRIVENET = 9186SIID_DRIVENETDISABLED = 10187SIID_DRIVECD = 11188SIID_DRIVERAM = 12189SIID_WORLD = 13190SIID_SERVER = 15191SIID_PRINTER = 16192SIID_MYNETWORK = 17193SIID_FIND = 22194SIID_HELP = 23195SIID_SHARE = 28196SIID_LINK = 29197SIID_SLOWFILE = 30198SIID_RECYCLER = 31199SIID_RECYCLERFULL = 32200SIID_MEDIACDAUDIO = 40201SIID_LOCK = 47202SIID_AUTOLIST = 49203SIID_PRINTERNET = 50204SIID_SERVERSHARE = 51205SIID_PRINTERFAX = 52206SIID_PRINTERFAXNET = 53207SIID_PRINTERFILE = 54208SIID_STACK = 55209SIID_MEDIASVCD = 56210SIID_STUFFEDFOLDER = 57211SIID_DRIVEUNKNOWN = 58212SIID_DRIVEDVD = 59213SIID_MEDIADVD = 60214SIID_MEDIADVDRAM = 61215SIID_MEDIADVDRW = 62216SIID_MEDIADVDR = 63217SIID_MEDIADVDROM = 64218SIID_MEDIACDAUDIOPLUS = 65219SIID_MEDIACDRW = 66220SIID_MEDIACDR = 67221SIID_MEDIACDBURN = 68222SIID_MEDIABLANKCD = 69223SIID_MEDIACDROM = 70224SIID_AUDIOFILES = 71225SIID_IMAGEFILES = 72226SIID_VIDEOFILES = 73227SIID_MIXEDFILES = 74228SIID_FOLDERBACK = 75229SIID_FOLDERFRONT = 76230SIID_SHIELD = 77231SIID_WARNING = 78232SIID_INFO = 79233SIID_ERROR = 80234SIID_KEY = 81235SIID_SOFTWARE = 82236SIID_RENAME = 83237SIID_DELETE = 84238SIID_MEDIAAUDIODVD = 85239SIID_MEDIAMOVIEDVD = 86240SIID_MEDIAENHANCEDCD = 87241SIID_MEDIAENHANCEDDVD = 88242SIID_MEDIAHDDVD = 89243SIID_MEDIABLURAY = 90244SIID_MEDIAVCD = 91245SIID_MEDIADVDPLUSR = 92246SIID_MEDIADVDPLUSRW = 93247SIID_DESKTOPPC = 94248SIID_MOBILEPC = 95249SIID_USERS = 96250SIID_MEDIASMARTMEDIA = 97251SIID_MEDIACOMPACTFLASH = 98252SIID_DEVICECELLPHONE = 99253SIID_DEVICECAMERA = 100254SIID_DEVICEVIDEOCAMERA = 101255SIID_DEVICEAUDIOPLAYER = 102256SIID_NETWORKCONNECT = 103257SIID_INTERNET = 104258SIID_ZIPFILE = 105259SIID_SETTINGS = 106260SIID_DRIVEHDDVD = 132261SIID_DRIVEBD = 133262SIID_MEDIAHDDVDROM = 134263SIID_MEDIAHDDVDR = 135264SIID_MEDIAHDDVDRAM = 136265SIID_MEDIABDROM = 137266SIID_MEDIABDR = 138267SIID_MEDIABDRE = 139268SIID_CLUSTEREDDRIVE = 140269SIID_MAX_ICONS = 175270)
271
272type NOTIFYICONDATA struct {273CbSize uint32274HWnd HWND
275UID uint32276UFlags uint32277UCallbackMessage uint32278HIcon HICON
279SzTip [128]uint16280DwState uint32281DwStateMask uint32282SzInfo [256]uint16283UVersion uint32284SzInfoTitle [64]uint16285DwInfoFlags uint32286GuidItem syscall.GUID287HBalloonIcon HICON
288}
289
290type SHFILEINFO struct {291HIcon HICON
292IIcon int32293DwAttributes uint32294SzDisplayName [MAX_PATH]uint16295SzTypeName [80]uint16296}
297
298type BROWSEINFO struct {299HwndOwner HWND
300PidlRoot uintptr301PszDisplayName *uint16302LpszTitle *uint16303UlFlags uint32304Lpfn uintptr305LParam uintptr306IImage int32307}
308
309type SHSTOCKICONINFO struct {310CbSize uint32311HIcon HICON
312ISysImageIndex int32313IIcon int32314SzPath [MAX_PATH]uint16315}
316
317var (318// Library319libshell32 *windows.LazyDLL320
321// Functions322dragAcceptFiles *windows.LazyProc323dragFinish *windows.LazyProc324dragQueryFile *windows.LazyProc325extractIcon *windows.LazyProc326shBrowseForFolder *windows.LazyProc327shDefExtractIcon *windows.LazyProc328shGetFileInfo *windows.LazyProc329shGetPathFromIDList *windows.LazyProc330shGetSpecialFolderPath *windows.LazyProc331shParseDisplayName *windows.LazyProc332shGetStockIconInfo *windows.LazyProc333shellExecute *windows.LazyProc334shell_NotifyIcon *windows.LazyProc335)
336
337func init() {338// Library339libshell32 = windows.NewLazySystemDLL("shell32.dll")340
341// Functions342dragAcceptFiles = libshell32.NewProc("DragAcceptFiles")343dragFinish = libshell32.NewProc("DragFinish")344dragQueryFile = libshell32.NewProc("DragQueryFileW")345extractIcon = libshell32.NewProc("ExtractIconW")346shBrowseForFolder = libshell32.NewProc("SHBrowseForFolderW")347shDefExtractIcon = libshell32.NewProc("SHDefExtractIconW")348shGetFileInfo = libshell32.NewProc("SHGetFileInfoW")349shGetPathFromIDList = libshell32.NewProc("SHGetPathFromIDListW")350shGetSpecialFolderPath = libshell32.NewProc("SHGetSpecialFolderPathW")351shGetStockIconInfo = libshell32.NewProc("SHGetStockIconInfo")352shellExecute = libshell32.NewProc("ShellExecuteW")353shell_NotifyIcon = libshell32.NewProc("Shell_NotifyIconW")354shParseDisplayName = libshell32.NewProc("SHParseDisplayName")355}
356
357func DragAcceptFiles(hWnd HWND, fAccept bool) bool {358ret, _, _ := syscall.Syscall(dragAcceptFiles.Addr(), 2,359uintptr(hWnd),360uintptr(BoolToBOOL(fAccept)),3610)362
363return ret != 0364}
365
366func DragQueryFile(hDrop HDROP, iFile uint, lpszFile *uint16, cch uint) uint {367ret, _, _ := syscall.Syscall6(dragQueryFile.Addr(), 4,368uintptr(hDrop),369uintptr(iFile),370uintptr(unsafe.Pointer(lpszFile)),371uintptr(cch),3720,3730)374
375return uint(ret)376}
377
378func DragFinish(hDrop HDROP) {379syscall.Syscall(dragAcceptFiles.Addr(), 1,380uintptr(hDrop),3810,3820)383}
384
385func ExtractIcon(hInst HINSTANCE, exeFileName *uint16, iconIndex int32) HICON {386ret, _, _ := syscall.Syscall(extractIcon.Addr(), 3,387uintptr(hInst),388uintptr(unsafe.Pointer(exeFileName)),389uintptr(iconIndex))390
391return HICON(ret)392}
393
394func SHBrowseForFolder(lpbi *BROWSEINFO) uintptr {395ret, _, _ := syscall.Syscall(shBrowseForFolder.Addr(), 1,396uintptr(unsafe.Pointer(lpbi)),3970,3980)399
400return ret401}
402
403func SHDefExtractIcon(pszIconFile *uint16, iIndex int32, uFlags uint32, phiconLarge, phiconSmall *HICON, nIconSize uint32) HRESULT {404ret, _, _ := syscall.Syscall6(shDefExtractIcon.Addr(), 6,405uintptr(unsafe.Pointer(pszIconFile)),406uintptr(iIndex),407uintptr(uFlags),408uintptr(unsafe.Pointer(phiconLarge)),409uintptr(unsafe.Pointer(phiconSmall)),410uintptr(nIconSize))411
412return HRESULT(ret)413}
414
415func SHGetFileInfo(pszPath *uint16, dwFileAttributes uint32, psfi *SHFILEINFO, cbFileInfo, uFlags uint32) uintptr {416ret, _, _ := syscall.Syscall6(shGetFileInfo.Addr(), 5,417uintptr(unsafe.Pointer(pszPath)),418uintptr(dwFileAttributes),419uintptr(unsafe.Pointer(psfi)),420uintptr(cbFileInfo),421uintptr(uFlags),4220)423
424return ret425}
426
427func SHGetPathFromIDList(pidl uintptr, pszPath *uint16) bool {428ret, _, _ := syscall.Syscall(shGetPathFromIDList.Addr(), 2,429pidl,430uintptr(unsafe.Pointer(pszPath)),4310)432
433return ret != 0434}
435
436func SHGetSpecialFolderPath(hwndOwner HWND, lpszPath *uint16, csidl CSIDL, fCreate bool) bool {437ret, _, _ := syscall.Syscall6(shGetSpecialFolderPath.Addr(), 4,438uintptr(hwndOwner),439uintptr(unsafe.Pointer(lpszPath)),440uintptr(csidl),441uintptr(BoolToBOOL(fCreate)),4420,4430)444
445return ret != 0446}
447
448func SHParseDisplayName(pszName *uint16, pbc uintptr, ppidl *uintptr, sfgaoIn uint32, psfgaoOut *uint32) HRESULT {449ret, _, _ := syscall.Syscall6(shParseDisplayName.Addr(), 5,450uintptr(unsafe.Pointer(pszName)),451pbc,452uintptr(unsafe.Pointer(ppidl)),4530,454uintptr(unsafe.Pointer(psfgaoOut)),4550)456
457return HRESULT(ret)458}
459
460func SHGetStockIconInfo(stockIconId int32, uFlags uint32, stockIcon *SHSTOCKICONINFO) HRESULT {461if shGetStockIconInfo.Find() != nil {462return HRESULT(0)463}464ret, _, _ := syscall.Syscall6(shGetStockIconInfo.Addr(), 3,465uintptr(stockIconId),466uintptr(uFlags),467uintptr(unsafe.Pointer(stockIcon)),4680,4690,4700,471)472return HRESULT(ret)473}
474
475func ShellExecute(hWnd HWND, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int) bool {476ret, _, _ := syscall.Syscall6(shellExecute.Addr(), 6,477uintptr(hWnd),478uintptr(unsafe.Pointer(verb)),479uintptr(unsafe.Pointer(file)),480uintptr(unsafe.Pointer(args)),481uintptr(unsafe.Pointer(cwd)),482uintptr(showCmd),483)484return ret != 0485}
486
487func Shell_NotifyIcon(dwMessage uint32, lpdata *NOTIFYICONDATA) bool {488ret, _, _ := syscall.Syscall(shell_NotifyIcon.Addr(), 2,489uintptr(dwMessage),490uintptr(unsafe.Pointer(lpdata)),4910)492
493return ret != 0494}
495