go-tg-screenshot-bot

Форк
0
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

7
package win
8

9
import (
10
	"golang.org/x/sys/windows"
11
	"syscall"
12
	"unsafe"
13
)
14

15
type CSIDL uint32
16
type HDROP HANDLE
17

18
const (
19
	CSIDL_DESKTOP                 = 0x00
20
	CSIDL_INTERNET                = 0x01
21
	CSIDL_PROGRAMS                = 0x02
22
	CSIDL_CONTROLS                = 0x03
23
	CSIDL_PRINTERS                = 0x04
24
	CSIDL_PERSONAL                = 0x05
25
	CSIDL_FAVORITES               = 0x06
26
	CSIDL_STARTUP                 = 0x07
27
	CSIDL_RECENT                  = 0x08
28
	CSIDL_SENDTO                  = 0x09
29
	CSIDL_BITBUCKET               = 0x0A
30
	CSIDL_STARTMENU               = 0x0B
31
	CSIDL_MYDOCUMENTS             = 0x0C
32
	CSIDL_MYMUSIC                 = 0x0D
33
	CSIDL_MYVIDEO                 = 0x0E
34
	CSIDL_DESKTOPDIRECTORY        = 0x10
35
	CSIDL_DRIVES                  = 0x11
36
	CSIDL_NETWORK                 = 0x12
37
	CSIDL_NETHOOD                 = 0x13
38
	CSIDL_FONTS                   = 0x14
39
	CSIDL_TEMPLATES               = 0x15
40
	CSIDL_COMMON_STARTMENU        = 0x16
41
	CSIDL_COMMON_PROGRAMS         = 0x17
42
	CSIDL_COMMON_STARTUP          = 0x18
43
	CSIDL_COMMON_DESKTOPDIRECTORY = 0x19
44
	CSIDL_APPDATA                 = 0x1A
45
	CSIDL_PRINTHOOD               = 0x1B
46
	CSIDL_LOCAL_APPDATA           = 0x1C
47
	CSIDL_ALTSTARTUP              = 0x1D
48
	CSIDL_COMMON_ALTSTARTUP       = 0x1E
49
	CSIDL_COMMON_FAVORITES        = 0x1F
50
	CSIDL_INTERNET_CACHE          = 0x20
51
	CSIDL_COOKIES                 = 0x21
52
	CSIDL_HISTORY                 = 0x22
53
	CSIDL_COMMON_APPDATA          = 0x23
54
	CSIDL_WINDOWS                 = 0x24
55
	CSIDL_SYSTEM                  = 0x25
56
	CSIDL_PROGRAM_FILES           = 0x26
57
	CSIDL_MYPICTURES              = 0x27
58
	CSIDL_PROFILE                 = 0x28
59
	CSIDL_SYSTEMX86               = 0x29
60
	CSIDL_PROGRAM_FILESX86        = 0x2A
61
	CSIDL_PROGRAM_FILES_COMMON    = 0x2B
62
	CSIDL_PROGRAM_FILES_COMMONX86 = 0x2C
63
	CSIDL_COMMON_TEMPLATES        = 0x2D
64
	CSIDL_COMMON_DOCUMENTS        = 0x2E
65
	CSIDL_COMMON_ADMINTOOLS       = 0x2F
66
	CSIDL_ADMINTOOLS              = 0x30
67
	CSIDL_CONNECTIONS             = 0x31
68
	CSIDL_COMMON_MUSIC            = 0x35
69
	CSIDL_COMMON_PICTURES         = 0x36
70
	CSIDL_COMMON_VIDEO            = 0x37
71
	CSIDL_RESOURCES               = 0x38
72
	CSIDL_RESOURCES_LOCALIZED     = 0x39
73
	CSIDL_COMMON_OEM_LINKS        = 0x3A
74
	CSIDL_CDBURN_AREA             = 0x3B
75
	CSIDL_COMPUTERSNEARME         = 0x3D
76
	CSIDL_FLAG_CREATE             = 0x8000
77
	CSIDL_FLAG_DONT_VERIFY        = 0x4000
78
	CSIDL_FLAG_NO_ALIAS           = 0x1000
79
	CSIDL_FLAG_PER_USER_INIT      = 0x8000
80
	CSIDL_FLAG_MASK               = 0xFF00
81
)
82

83
// NotifyIcon flags
84
const (
85
	NIF_MESSAGE  = 0x00000001
86
	NIF_ICON     = 0x00000002
87
	NIF_TIP      = 0x00000004
88
	NIF_STATE    = 0x00000008
89
	NIF_INFO     = 0x00000010
90
	NIF_GUID     = 0x00000020
91
	NIF_REALTIME = 0x00000040
92
	NIF_SHOWTIP  = 0x00000080
93
)
94

95
// NotifyIcon messages
96
const (
97
	NIM_ADD        = 0x00000000
98
	NIM_MODIFY     = 0x00000001
99
	NIM_DELETE     = 0x00000002
100
	NIM_SETFOCUS   = 0x00000003
101
	NIM_SETVERSION = 0x00000004
102
)
103

104
// NotifyIcon states
105
const (
106
	NIS_HIDDEN     = 0x00000001
107
	NIS_SHAREDICON = 0x00000002
108
)
109

110
// NotifyIcon info flags
111
const (
112
	NIIF_NONE               = 0x00000000
113
	NIIF_INFO               = 0x00000001
114
	NIIF_WARNING            = 0x00000002
115
	NIIF_ERROR              = 0x00000003
116
	NIIF_USER               = 0x00000004
117
	NIIF_NOSOUND            = 0x00000010
118
	NIIF_LARGE_ICON         = 0x00000020
119
	NIIF_RESPECT_QUIET_TIME = 0x00000080
120
)
121

122
// NotifyIcon notifications
123
const (
124
	NIN_SELECT           = WM_USER + 0
125
	NIN_KEYSELECT        = WM_USER + 1
126
	NIN_BALLOONSHOW      = WM_USER + 2
127
	NIN_BALLOONHIDE      = WM_USER + 3
128
	NIN_BALLOONTIMEOUT   = WM_USER + 4
129
	NIN_BALLOONUSERCLICK = WM_USER + 5
130
	NIN_POPUPOPEN        = WM_USER + 6
131
	NIN_POPUPCLOSE       = WM_USER + 7
132
)
133

134
// NotifyIcon versions
135
const (
136
	NOTIFYICON_VERSION   = 3
137
	NOTIFYICON_VERSION_4 = 4
138
)
139

140
// SHGetFileInfo flags
141
const (
142
	SHGFI_LARGEICON         = 0x000000000
143
	SHGFI_SMALLICON         = 0x000000001
144
	SHGFI_OPENICON          = 0x000000002
145
	SHGFI_SHELLICONSIZE     = 0x000000004
146
	SHGFI_PIDL              = 0x000000008
147
	SHGFI_USEFILEATTRIBUTES = 0x000000010
148
	SHGFI_ADDOVERLAYS       = 0x000000020
149
	SHGFI_OVERLAYINDEX      = 0x000000040
150
	SHGFI_ICON              = 0x000000100
151
	SHGFI_DISPLAYNAME       = 0x000000200
152
	SHGFI_TYPENAME          = 0x000000400
153
	SHGFI_ATTRIBUTES        = 0x000000800
154
	SHGFI_ICONLOCATION      = 0x000001000
155
	SHGFI_EXETYPE           = 0x000002000
156
	SHGFI_SYSICONINDEX      = 0x000004000
157
	SHGFI_LINKOVERLAY       = 0x000008000
158
	SHGFI_SELECTED          = 0x000010000
159
	SHGFI_ATTR_SPECIFIED    = 0x000020000
160
)
161

162
// SHGetStockIconInfo flags
163
const (
164
	SHGSI_ICONLOCATION  = 0
165
	SHGSI_ICON          = 0x000000100
166
	SHGSI_SYSICONINDEX  = 0x000004000
167
	SHGSI_LINKOVERLAY   = 0x000008000
168
	SHGSI_SELECTED      = 0x000010000
169
	SHGSI_LARGEICON     = 0x000000000
170
	SHGSI_SMALLICON     = 0x000000001
171
	SHGSI_SHELLICONSIZE = 0x000000004
172
)
173

174
// SHSTOCKICONID values
175
const (
176
	SIID_DOCNOASSOC        = 0
177
	SIID_DOCASSOC          = 1
178
	SIID_APPLICATION       = 2
179
	SIID_FOLDER            = 3
180
	SIID_FOLDEROPEN        = 4
181
	SIID_DRIVE525          = 5
182
	SIID_DRIVE35           = 6
183
	SIID_DRIVEREMOVE       = 7
184
	SIID_DRIVEFIXED        = 8
185
	SIID_DRIVENET          = 9
186
	SIID_DRIVENETDISABLED  = 10
187
	SIID_DRIVECD           = 11
188
	SIID_DRIVERAM          = 12
189
	SIID_WORLD             = 13
190
	SIID_SERVER            = 15
191
	SIID_PRINTER           = 16
192
	SIID_MYNETWORK         = 17
193
	SIID_FIND              = 22
194
	SIID_HELP              = 23
195
	SIID_SHARE             = 28
196
	SIID_LINK              = 29
197
	SIID_SLOWFILE          = 30
198
	SIID_RECYCLER          = 31
199
	SIID_RECYCLERFULL      = 32
200
	SIID_MEDIACDAUDIO      = 40
201
	SIID_LOCK              = 47
202
	SIID_AUTOLIST          = 49
203
	SIID_PRINTERNET        = 50
204
	SIID_SERVERSHARE       = 51
205
	SIID_PRINTERFAX        = 52
206
	SIID_PRINTERFAXNET     = 53
207
	SIID_PRINTERFILE       = 54
208
	SIID_STACK             = 55
209
	SIID_MEDIASVCD         = 56
210
	SIID_STUFFEDFOLDER     = 57
211
	SIID_DRIVEUNKNOWN      = 58
212
	SIID_DRIVEDVD          = 59
213
	SIID_MEDIADVD          = 60
214
	SIID_MEDIADVDRAM       = 61
215
	SIID_MEDIADVDRW        = 62
216
	SIID_MEDIADVDR         = 63
217
	SIID_MEDIADVDROM       = 64
218
	SIID_MEDIACDAUDIOPLUS  = 65
219
	SIID_MEDIACDRW         = 66
220
	SIID_MEDIACDR          = 67
221
	SIID_MEDIACDBURN       = 68
222
	SIID_MEDIABLANKCD      = 69
223
	SIID_MEDIACDROM        = 70
224
	SIID_AUDIOFILES        = 71
225
	SIID_IMAGEFILES        = 72
226
	SIID_VIDEOFILES        = 73
227
	SIID_MIXEDFILES        = 74
228
	SIID_FOLDERBACK        = 75
229
	SIID_FOLDERFRONT       = 76
230
	SIID_SHIELD            = 77
231
	SIID_WARNING           = 78
232
	SIID_INFO              = 79
233
	SIID_ERROR             = 80
234
	SIID_KEY               = 81
235
	SIID_SOFTWARE          = 82
236
	SIID_RENAME            = 83
237
	SIID_DELETE            = 84
238
	SIID_MEDIAAUDIODVD     = 85
239
	SIID_MEDIAMOVIEDVD     = 86
240
	SIID_MEDIAENHANCEDCD   = 87
241
	SIID_MEDIAENHANCEDDVD  = 88
242
	SIID_MEDIAHDDVD        = 89
243
	SIID_MEDIABLURAY       = 90
244
	SIID_MEDIAVCD          = 91
245
	SIID_MEDIADVDPLUSR     = 92
246
	SIID_MEDIADVDPLUSRW    = 93
247
	SIID_DESKTOPPC         = 94
248
	SIID_MOBILEPC          = 95
249
	SIID_USERS             = 96
250
	SIID_MEDIASMARTMEDIA   = 97
251
	SIID_MEDIACOMPACTFLASH = 98
252
	SIID_DEVICECELLPHONE   = 99
253
	SIID_DEVICECAMERA      = 100
254
	SIID_DEVICEVIDEOCAMERA = 101
255
	SIID_DEVICEAUDIOPLAYER = 102
256
	SIID_NETWORKCONNECT    = 103
257
	SIID_INTERNET          = 104
258
	SIID_ZIPFILE           = 105
259
	SIID_SETTINGS          = 106
260
	SIID_DRIVEHDDVD        = 132
261
	SIID_DRIVEBD           = 133
262
	SIID_MEDIAHDDVDROM     = 134
263
	SIID_MEDIAHDDVDR       = 135
264
	SIID_MEDIAHDDVDRAM     = 136
265
	SIID_MEDIABDROM        = 137
266
	SIID_MEDIABDR          = 138
267
	SIID_MEDIABDRE         = 139
268
	SIID_CLUSTEREDDRIVE    = 140
269
	SIID_MAX_ICONS         = 175
270
)
271

272
type NOTIFYICONDATA struct {
273
	CbSize           uint32
274
	HWnd             HWND
275
	UID              uint32
276
	UFlags           uint32
277
	UCallbackMessage uint32
278
	HIcon            HICON
279
	SzTip            [128]uint16
280
	DwState          uint32
281
	DwStateMask      uint32
282
	SzInfo           [256]uint16
283
	UVersion         uint32
284
	SzInfoTitle      [64]uint16
285
	DwInfoFlags      uint32
286
	GuidItem         syscall.GUID
287
	HBalloonIcon     HICON
288
}
289

290
type SHFILEINFO struct {
291
	HIcon         HICON
292
	IIcon         int32
293
	DwAttributes  uint32
294
	SzDisplayName [MAX_PATH]uint16
295
	SzTypeName    [80]uint16
296
}
297

298
type BROWSEINFO struct {
299
	HwndOwner      HWND
300
	PidlRoot       uintptr
301
	PszDisplayName *uint16
302
	LpszTitle      *uint16
303
	UlFlags        uint32
304
	Lpfn           uintptr
305
	LParam         uintptr
306
	IImage         int32
307
}
308

309
type SHSTOCKICONINFO struct {
310
	CbSize         uint32
311
	HIcon          HICON
312
	ISysImageIndex int32
313
	IIcon          int32
314
	SzPath         [MAX_PATH]uint16
315
}
316

317
var (
318
	// Library
319
	libshell32 *windows.LazyDLL
320

321
	// Functions
322
	dragAcceptFiles        *windows.LazyProc
323
	dragFinish             *windows.LazyProc
324
	dragQueryFile          *windows.LazyProc
325
	extractIcon            *windows.LazyProc
326
	shBrowseForFolder      *windows.LazyProc
327
	shDefExtractIcon       *windows.LazyProc
328
	shGetFileInfo          *windows.LazyProc
329
	shGetPathFromIDList    *windows.LazyProc
330
	shGetSpecialFolderPath *windows.LazyProc
331
	shParseDisplayName     *windows.LazyProc
332
	shGetStockIconInfo     *windows.LazyProc
333
	shellExecute           *windows.LazyProc
334
	shell_NotifyIcon       *windows.LazyProc
335
)
336

337
func init() {
338
	// Library
339
	libshell32 = windows.NewLazySystemDLL("shell32.dll")
340

341
	// Functions
342
	dragAcceptFiles = libshell32.NewProc("DragAcceptFiles")
343
	dragFinish = libshell32.NewProc("DragFinish")
344
	dragQueryFile = libshell32.NewProc("DragQueryFileW")
345
	extractIcon = libshell32.NewProc("ExtractIconW")
346
	shBrowseForFolder = libshell32.NewProc("SHBrowseForFolderW")
347
	shDefExtractIcon = libshell32.NewProc("SHDefExtractIconW")
348
	shGetFileInfo = libshell32.NewProc("SHGetFileInfoW")
349
	shGetPathFromIDList = libshell32.NewProc("SHGetPathFromIDListW")
350
	shGetSpecialFolderPath = libshell32.NewProc("SHGetSpecialFolderPathW")
351
	shGetStockIconInfo = libshell32.NewProc("SHGetStockIconInfo")
352
	shellExecute = libshell32.NewProc("ShellExecuteW")
353
	shell_NotifyIcon = libshell32.NewProc("Shell_NotifyIconW")
354
	shParseDisplayName = libshell32.NewProc("SHParseDisplayName")
355
}
356

357
func DragAcceptFiles(hWnd HWND, fAccept bool) bool {
358
	ret, _, _ := syscall.Syscall(dragAcceptFiles.Addr(), 2,
359
		uintptr(hWnd),
360
		uintptr(BoolToBOOL(fAccept)),
361
		0)
362

363
	return ret != 0
364
}
365

366
func DragQueryFile(hDrop HDROP, iFile uint, lpszFile *uint16, cch uint) uint {
367
	ret, _, _ := syscall.Syscall6(dragQueryFile.Addr(), 4,
368
		uintptr(hDrop),
369
		uintptr(iFile),
370
		uintptr(unsafe.Pointer(lpszFile)),
371
		uintptr(cch),
372
		0,
373
		0)
374

375
	return uint(ret)
376
}
377

378
func DragFinish(hDrop HDROP) {
379
	syscall.Syscall(dragAcceptFiles.Addr(), 1,
380
		uintptr(hDrop),
381
		0,
382
		0)
383
}
384

385
func ExtractIcon(hInst HINSTANCE, exeFileName *uint16, iconIndex int32) HICON {
386
	ret, _, _ := syscall.Syscall(extractIcon.Addr(), 3,
387
		uintptr(hInst),
388
		uintptr(unsafe.Pointer(exeFileName)),
389
		uintptr(iconIndex))
390

391
	return HICON(ret)
392
}
393

394
func SHBrowseForFolder(lpbi *BROWSEINFO) uintptr {
395
	ret, _, _ := syscall.Syscall(shBrowseForFolder.Addr(), 1,
396
		uintptr(unsafe.Pointer(lpbi)),
397
		0,
398
		0)
399

400
	return ret
401
}
402

403
func SHDefExtractIcon(pszIconFile *uint16, iIndex int32, uFlags uint32, phiconLarge, phiconSmall *HICON, nIconSize uint32) HRESULT {
404
	ret, _, _ := syscall.Syscall6(shDefExtractIcon.Addr(), 6,
405
		uintptr(unsafe.Pointer(pszIconFile)),
406
		uintptr(iIndex),
407
		uintptr(uFlags),
408
		uintptr(unsafe.Pointer(phiconLarge)),
409
		uintptr(unsafe.Pointer(phiconSmall)),
410
		uintptr(nIconSize))
411

412
	return HRESULT(ret)
413
}
414

415
func SHGetFileInfo(pszPath *uint16, dwFileAttributes uint32, psfi *SHFILEINFO, cbFileInfo, uFlags uint32) uintptr {
416
	ret, _, _ := syscall.Syscall6(shGetFileInfo.Addr(), 5,
417
		uintptr(unsafe.Pointer(pszPath)),
418
		uintptr(dwFileAttributes),
419
		uintptr(unsafe.Pointer(psfi)),
420
		uintptr(cbFileInfo),
421
		uintptr(uFlags),
422
		0)
423

424
	return ret
425
}
426

427
func SHGetPathFromIDList(pidl uintptr, pszPath *uint16) bool {
428
	ret, _, _ := syscall.Syscall(shGetPathFromIDList.Addr(), 2,
429
		pidl,
430
		uintptr(unsafe.Pointer(pszPath)),
431
		0)
432

433
	return ret != 0
434
}
435

436
func SHGetSpecialFolderPath(hwndOwner HWND, lpszPath *uint16, csidl CSIDL, fCreate bool) bool {
437
	ret, _, _ := syscall.Syscall6(shGetSpecialFolderPath.Addr(), 4,
438
		uintptr(hwndOwner),
439
		uintptr(unsafe.Pointer(lpszPath)),
440
		uintptr(csidl),
441
		uintptr(BoolToBOOL(fCreate)),
442
		0,
443
		0)
444

445
	return ret != 0
446
}
447

448
func SHParseDisplayName(pszName *uint16, pbc uintptr, ppidl *uintptr, sfgaoIn uint32, psfgaoOut *uint32) HRESULT {
449
	ret, _, _ := syscall.Syscall6(shParseDisplayName.Addr(), 5,
450
		uintptr(unsafe.Pointer(pszName)),
451
		pbc,
452
		uintptr(unsafe.Pointer(ppidl)),
453
		0,
454
		uintptr(unsafe.Pointer(psfgaoOut)),
455
		0)
456

457
	return HRESULT(ret)
458
}
459

460
func SHGetStockIconInfo(stockIconId int32, uFlags uint32, stockIcon *SHSTOCKICONINFO) HRESULT {
461
	if shGetStockIconInfo.Find() != nil {
462
		return HRESULT(0)
463
	}
464
	ret, _, _ := syscall.Syscall6(shGetStockIconInfo.Addr(), 3,
465
		uintptr(stockIconId),
466
		uintptr(uFlags),
467
		uintptr(unsafe.Pointer(stockIcon)),
468
		0,
469
		0,
470
		0,
471
	)
472
	return HRESULT(ret)
473
}
474

475
func ShellExecute(hWnd HWND, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int) bool {
476
	ret, _, _ := syscall.Syscall6(shellExecute.Addr(), 6,
477
		uintptr(hWnd),
478
		uintptr(unsafe.Pointer(verb)),
479
		uintptr(unsafe.Pointer(file)),
480
		uintptr(unsafe.Pointer(args)),
481
		uintptr(unsafe.Pointer(cwd)),
482
		uintptr(showCmd),
483
	)
484
	return ret != 0
485
}
486

487
func Shell_NotifyIcon(dwMessage uint32, lpdata *NOTIFYICONDATA) bool {
488
	ret, _, _ := syscall.Syscall(shell_NotifyIcon.Addr(), 2,
489
		uintptr(dwMessage),
490
		uintptr(unsafe.Pointer(lpdata)),
491
		0)
492

493
	return ret != 0
494
}
495

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.