mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 05:00:31 +08:00
860 lines
24 KiB
Go
860 lines
24 KiB
Go
//go:build windows
|
|
|
|
package win32
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"github.com/wailsapp/wails/v2/internal/system/operatingsystem"
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
var (
|
|
modKernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
procGetModuleHandle = modKernel32.NewProc("GetModuleHandleW")
|
|
|
|
moduser32 = syscall.NewLazyDLL("user32.dll")
|
|
procRegisterClassEx = moduser32.NewProc("RegisterClassExW")
|
|
procLoadIcon = moduser32.NewProc("LoadIconW")
|
|
procLoadCursor = moduser32.NewProc("LoadCursorW")
|
|
procCreateWindowEx = moduser32.NewProc("CreateWindowExW")
|
|
procPostMessage = moduser32.NewProc("PostMessageW")
|
|
procGetCursorPos = moduser32.NewProc("GetCursorPos")
|
|
procSetForegroundWindow = moduser32.NewProc("SetForegroundWindow")
|
|
procCreatePopupMenu = moduser32.NewProc("CreatePopupMenu")
|
|
procTrackPopupMenu = moduser32.NewProc("TrackPopupMenu")
|
|
procDestroyMenu = moduser32.NewProc("DestroyMenu")
|
|
procAppendMenuW = moduser32.NewProc("AppendMenuW")
|
|
procCheckMenuItem = moduser32.NewProc("CheckMenuItem")
|
|
procCheckMenuRadioItem = moduser32.NewProc("CheckMenuRadioItem")
|
|
procCreateIconFromResourceEx = moduser32.NewProc("CreateIconFromResourceEx")
|
|
procGetMessageW = moduser32.NewProc("GetMessageW")
|
|
procIsDialogMessage = moduser32.NewProc("IsDialogMessageW")
|
|
procTranslateMessage = moduser32.NewProc("TranslateMessage")
|
|
procDispatchMessage = moduser32.NewProc("DispatchMessageW")
|
|
procPostQuitMessage = moduser32.NewProc("PostQuitMessage")
|
|
procSystemParametersInfo = moduser32.NewProc("SystemParametersInfoW")
|
|
procSetWindowCompositionAttribute = moduser32.NewProc("SetWindowCompositionAttribute")
|
|
procGetKeyState = moduser32.NewProc("GetKeyState")
|
|
procCreateAcceleratorTable = moduser32.NewProc("CreateAcceleratorTableW")
|
|
procTranslateAccelerator = moduser32.NewProc("TranslateAcceleratorW")
|
|
|
|
modshell32 = syscall.NewLazyDLL("shell32.dll")
|
|
procShellNotifyIcon = modshell32.NewProc("Shell_NotifyIconW")
|
|
|
|
moddwmapi = syscall.NewLazyDLL("dwmapi.dll")
|
|
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
|
|
|
moduxtheme = syscall.NewLazyDLL("uxtheme.dll")
|
|
procSetWindowTheme = moduxtheme.NewProc("SetWindowTheme")
|
|
|
|
AllowDarkModeForWindow func(HWND, bool) uintptr
|
|
SetPreferredAppMode func(int32) uintptr
|
|
)
|
|
|
|
type PreferredAppMode = int32
|
|
|
|
const (
|
|
PreferredAppModeDefault PreferredAppMode = iota
|
|
PreferredAppModeAllowDark
|
|
PreferredAppModeForceDark
|
|
PreferredAppModeForceLight
|
|
PreferredAppModeMax
|
|
)
|
|
|
|
/*
|
|
RtlGetNtVersionNumbers = void (LPDWORD major, LPDWORD minor, LPDWORD build) // 1809 17763
|
|
ShouldAppsUseDarkMode = bool () // ordinal 132
|
|
AllowDarkModeForWindow = bool (HWND hWnd, bool allow) // ordinal 133
|
|
AllowDarkModeForApp = bool (bool allow) // ordinal 135, removed since 18334
|
|
FlushMenuThemes = void () // ordinal 136
|
|
RefreshImmersiveColorPolicyState = void () // ordinal 104
|
|
IsDarkModeAllowedForWindow = bool (HWND hWnd) // ordinal 137
|
|
GetIsImmersiveColorUsingHighContrast = bool (IMMERSIVE_HC_CACHE_MODE mode) // ordinal 106
|
|
OpenNcThemeData = HTHEME (HWND hWnd, LPCWSTR pszClassList) // ordinal 49
|
|
// Insider 18290
|
|
ShouldSystemUseDarkMode = bool () // ordinal 138
|
|
// Insider 18334
|
|
SetPreferredAppMode = PreferredAppMode (PreferredAppMode appMode) // ordinal 135, since 18334
|
|
IsDarkModeAllowedForApp = bool () // ordinal 139
|
|
*/
|
|
func init() {
|
|
if IsWindowsVersionAtLeast(10, 0, 18334) {
|
|
|
|
// AllowDarkModeForWindow is only available on Windows 10+
|
|
uxtheme, err := windows.LoadLibrary("uxtheme.dll")
|
|
if err == nil {
|
|
procAllowDarkModeForWindow, err := windows.GetProcAddressByOrdinal(uxtheme, uintptr(133))
|
|
if err == nil {
|
|
AllowDarkModeForWindow = func(hwnd HWND, allow bool) uintptr {
|
|
var allowInt int32
|
|
if allow {
|
|
allowInt = 1
|
|
}
|
|
ret, _, _ := syscall.SyscallN(procAllowDarkModeForWindow, uintptr(hwnd), uintptr(allowInt))
|
|
return ret
|
|
}
|
|
}
|
|
}
|
|
|
|
// SetPreferredAppMode is only available on Windows 10+
|
|
procSetPreferredAppMode, err := windows.GetProcAddressByOrdinal(uxtheme, uintptr(135))
|
|
if err == nil {
|
|
SetPreferredAppMode = func(mode int32) uintptr {
|
|
ret, _, _ := syscall.SyscallN(procSetPreferredAppMode, uintptr(mode))
|
|
return ret
|
|
}
|
|
SetPreferredAppMode(PreferredAppModeAllowDark)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
type HANDLE uintptr
|
|
type HINSTANCE = HANDLE
|
|
type HICON = HANDLE
|
|
type HCURSOR = HANDLE
|
|
type HBRUSH = HANDLE
|
|
type HWND = HANDLE
|
|
type HMENU = HANDLE
|
|
type DWORD = uint32
|
|
type ATOM uint16
|
|
type MenuID uint16
|
|
|
|
const (
|
|
WM_APP = 32768
|
|
WM_ACTIVATE = 6
|
|
WM_ACTIVATEAPP = 28
|
|
WM_AFXFIRST = 864
|
|
WM_AFXLAST = 895
|
|
WM_ASKCBFORMATNAME = 780
|
|
WM_CANCELJOURNAL = 75
|
|
WM_CANCELMODE = 31
|
|
WM_CAPTURECHANGED = 533
|
|
WM_CHANGECBCHAIN = 781
|
|
WM_CHAR = 258
|
|
WM_CHARTOITEM = 47
|
|
WM_CHILDACTIVATE = 34
|
|
WM_CLEAR = 771
|
|
WM_CLOSE = 16
|
|
WM_COMMAND = 273
|
|
WM_COMMNOTIFY = 68 /* OBSOLETE */
|
|
WM_COMPACTING = 65
|
|
WM_COMPAREITEM = 57
|
|
WM_CONTEXTMENU = 123
|
|
WM_COPY = 769
|
|
WM_COPYDATA = 74
|
|
WM_CREATE = 1
|
|
WM_CTLCOLORBTN = 309
|
|
WM_CTLCOLORDLG = 310
|
|
WM_CTLCOLOREDIT = 307
|
|
WM_CTLCOLORLISTBOX = 308
|
|
WM_CTLCOLORMSGBOX = 306
|
|
WM_CTLCOLORSCROLLBAR = 311
|
|
WM_CTLCOLORSTATIC = 312
|
|
WM_CUT = 768
|
|
WM_DEADCHAR = 259
|
|
WM_DELETEITEM = 45
|
|
WM_DESTROY = 2
|
|
WM_DESTROYCLIPBOARD = 775
|
|
WM_DEVICECHANGE = 537
|
|
WM_DEVMODECHANGE = 27
|
|
WM_DISPLAYCHANGE = 126
|
|
WM_DRAWCLIPBOARD = 776
|
|
WM_DRAWITEM = 43
|
|
WM_DROPFILES = 563
|
|
WM_ENABLE = 10
|
|
WM_ENDSESSION = 22
|
|
WM_ENTERIDLE = 289
|
|
WM_ENTERMENULOOP = 529
|
|
WM_ENTERSIZEMOVE = 561
|
|
WM_ERASEBKGND = 20
|
|
WM_EXITMENULOOP = 530
|
|
WM_EXITSIZEMOVE = 562
|
|
WM_FONTCHANGE = 29
|
|
WM_GETDLGCODE = 135
|
|
WM_GETFONT = 49
|
|
WM_GETHOTKEY = 51
|
|
WM_GETICON = 127
|
|
WM_GETMINMAXINFO = 36
|
|
WM_GETTEXT = 13
|
|
WM_GETTEXTLENGTH = 14
|
|
WM_HANDHELDFIRST = 856
|
|
WM_HANDHELDLAST = 863
|
|
WM_HELP = 83
|
|
WM_HOTKEY = 786
|
|
WM_HSCROLL = 276
|
|
WM_HSCROLLCLIPBOARD = 782
|
|
WM_ICONERASEBKGND = 39
|
|
WM_INITDIALOG = 272
|
|
WM_INITMENU = 278
|
|
WM_INITMENUPOPUP = 279
|
|
WM_INPUT = 0x00FF
|
|
WM_INPUTLANGCHANGE = 81
|
|
WM_INPUTLANGCHANGEREQUEST = 80
|
|
WM_KEYDOWN = 256
|
|
WM_KEYUP = 257
|
|
WM_KILLFOCUS = 8
|
|
WM_MDIACTIVATE = 546
|
|
WM_MDICASCADE = 551
|
|
WM_MDICREATE = 544
|
|
WM_MDIDESTROY = 545
|
|
WM_MDIGETACTIVE = 553
|
|
WM_MDIICONARRANGE = 552
|
|
WM_MDIMAXIMIZE = 549
|
|
WM_MDINEXT = 548
|
|
WM_MDIREFRESHMENU = 564
|
|
WM_MDIRESTORE = 547
|
|
WM_MDISETMENU = 560
|
|
WM_MDITILE = 550
|
|
WM_MEASUREITEM = 44
|
|
WM_GETOBJECT = 0x003D
|
|
WM_CHANGEUISTATE = 0x0127
|
|
WM_UPDATEUISTATE = 0x0128
|
|
WM_QUERYUISTATE = 0x0129
|
|
WM_UNINITMENUPOPUP = 0x0125
|
|
WM_MENURBUTTONUP = 290
|
|
WM_MENUCOMMAND = 0x0126
|
|
WM_MENUGETOBJECT = 0x0124
|
|
WM_MENUDRAG = 0x0123
|
|
WM_APPCOMMAND = 0x0319
|
|
WM_MENUCHAR = 288
|
|
WM_MENUSELECT = 287
|
|
WM_MOVE = 3
|
|
WM_MOVING = 534
|
|
WM_NCACTIVATE = 134
|
|
WM_NCCALCSIZE = 131
|
|
WM_NCCREATE = 129
|
|
WM_NCDESTROY = 130
|
|
WM_NCHITTEST = 132
|
|
WM_NCLBUTTONDBLCLK = 163
|
|
WM_NCLBUTTONDOWN = 161
|
|
WM_NCLBUTTONUP = 162
|
|
WM_NCMBUTTONDBLCLK = 169
|
|
WM_NCMBUTTONDOWN = 167
|
|
WM_NCMBUTTONUP = 168
|
|
WM_NCXBUTTONDOWN = 171
|
|
WM_NCXBUTTONUP = 172
|
|
WM_NCXBUTTONDBLCLK = 173
|
|
WM_NCMOUSEHOVER = 0x02A0
|
|
WM_NCMOUSELEAVE = 0x02A2
|
|
WM_NCMOUSEMOVE = 160
|
|
WM_NCPAINT = 133
|
|
WM_NCRBUTTONDBLCLK = 166
|
|
WM_NCRBUTTONDOWN = 164
|
|
WM_NCRBUTTONUP = 165
|
|
WM_NEXTDLGCTL = 40
|
|
WM_NEXTMENU = 531
|
|
WM_NOTIFY = 78
|
|
WM_NOTIFYFORMAT = 85
|
|
WM_NULL = 0
|
|
WM_PAINT = 15
|
|
WM_PAINTCLIPBOARD = 777
|
|
WM_PAINTICON = 38
|
|
WM_PALETTECHANGED = 785
|
|
WM_PALETTEISCHANGING = 784
|
|
WM_PARENTNOTIFY = 528
|
|
WM_PASTE = 770
|
|
WM_PENWINFIRST = 896
|
|
WM_PENWINLAST = 911
|
|
WM_POWER = 72
|
|
WM_PRINT = 791
|
|
WM_PRINTCLIENT = 792
|
|
WM_QUERYDRAGICON = 55
|
|
WM_QUERYENDSESSION = 17
|
|
WM_QUERYNEWPALETTE = 783
|
|
WM_QUERYOPEN = 19
|
|
WM_QUEUESYNC = 35
|
|
WM_QUIT = 18
|
|
WM_RENDERALLFORMATS = 774
|
|
WM_RENDERFORMAT = 773
|
|
WM_SETCURSOR = 32
|
|
WM_SETFOCUS = 7
|
|
WM_SETFONT = 48
|
|
WM_SETHOTKEY = 50
|
|
WM_SETICON = 128
|
|
WM_SETREDRAW = 11
|
|
WM_SETTEXT = 12
|
|
WM_SETTINGCHANGE = 26
|
|
WM_SHOWWINDOW = 24
|
|
WM_SIZE = 5
|
|
WM_SIZECLIPBOARD = 779
|
|
WM_SIZING = 532
|
|
WM_SPOOLERSTATUS = 42
|
|
WM_STYLECHANGED = 125
|
|
WM_STYLECHANGING = 124
|
|
WM_SYSCHAR = 262
|
|
WM_SYSCOLORCHANGE = 21
|
|
WM_SYSCOMMAND = 274
|
|
WM_SYSDEADCHAR = 263
|
|
WM_SYSKEYDOWN = 260
|
|
WM_SYSKEYUP = 261
|
|
WM_TCARD = 82
|
|
WM_THEMECHANGED = 794
|
|
WM_TIMECHANGE = 30
|
|
WM_TIMER = 275
|
|
WM_UNDO = 772
|
|
WM_USER = 1024
|
|
WM_USERCHANGED = 84
|
|
WM_VKEYTOITEM = 46
|
|
WM_VSCROLL = 277
|
|
WM_VSCROLLCLIPBOARD = 778
|
|
WM_WINDOWPOSCHANGED = 71
|
|
WM_WINDOWPOSCHANGING = 70
|
|
WM_WININICHANGE = 26
|
|
WM_KEYFIRST = 256
|
|
WM_KEYLAST = 264
|
|
WM_SYNCPAINT = 136
|
|
WM_MOUSEACTIVATE = 33
|
|
WM_MOUSEMOVE = 512
|
|
WM_LBUTTONDOWN = 513
|
|
WM_LBUTTONUP = 514
|
|
WM_LBUTTONDBLCLK = 515
|
|
WM_RBUTTONDOWN = 516
|
|
WM_RBUTTONUP = 517
|
|
WM_RBUTTONDBLCLK = 518
|
|
WM_MBUTTONDOWN = 519
|
|
WM_MBUTTONUP = 520
|
|
WM_MBUTTONDBLCLK = 521
|
|
WM_MOUSEWHEEL = 522
|
|
WM_MOUSEFIRST = 512
|
|
WM_XBUTTONDOWN = 523
|
|
WM_XBUTTONUP = 524
|
|
WM_XBUTTONDBLCLK = 525
|
|
WM_MOUSELAST = 525
|
|
WM_MOUSEHOVER = 0x2A1
|
|
WM_MOUSELEAVE = 0x2A3
|
|
WM_CLIPBOARDUPDATE = 0x031D
|
|
|
|
WS_EX_APPWINDOW = 0x00040000
|
|
WS_OVERLAPPEDWINDOW = 0x00000000 | 0x00C00000 | 0x00080000 | 0x00040000 | 0x00020000 | 0x00010000
|
|
WS_EX_NOREDIRECTIONBITMAP = 0x00200000
|
|
CW_USEDEFAULT = ^0x7fffffff
|
|
|
|
NIM_ADD = 0x00000000
|
|
NIM_MODIFY = 0x00000001
|
|
NIM_DELETE = 0x00000002
|
|
NIM_SETVERSION = 0x00000004
|
|
|
|
NIF_MESSAGE = 0x00000001
|
|
NIF_ICON = 0x00000002
|
|
NIF_TIP = 0x00000004
|
|
NIF_STATE = 0x00000008
|
|
NIF_INFO = 0x00000010
|
|
|
|
NIS_HIDDEN = 0x00000001
|
|
|
|
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
|
|
NIIF_ICON_MASK = 0x0000000F
|
|
|
|
IMAGE_BITMAP = 0
|
|
IMAGE_ICON = 1
|
|
LR_LOADFROMFILE = 0x00000010
|
|
LR_DEFAULTSIZE = 0x00000040
|
|
|
|
IDC_ARROW = 32512
|
|
COLOR_WINDOW = 5
|
|
COLOR_BTNFACE = 15
|
|
|
|
GWLP_USERDATA = -21
|
|
WS_CLIPSIBLINGS = 0x04000000
|
|
WS_EX_CONTROLPARENT = 0x00010000
|
|
|
|
HWND_MESSAGE = ^HWND(2)
|
|
NOTIFYICON_VERSION = 4
|
|
|
|
IDI_APPLICATION = 32512
|
|
|
|
MenuItemMsgID = WM_APP + 1024
|
|
NotifyIconMessageId = WM_APP + iota
|
|
|
|
MF_STRING = 0x00000000
|
|
MF_ENABLED = 0x00000000
|
|
MF_GRAYED = 0x00000001
|
|
MF_DISABLED = 0x00000002
|
|
MF_SEPARATOR = 0x00000800
|
|
MF_UNCHECKED = 0x00000000
|
|
MF_CHECKED = 0x00000008
|
|
MF_POPUP = 0x00000010
|
|
MF_MENUBARBREAK = 0x00000020
|
|
MF_BYCOMMAND = 0x00000000
|
|
|
|
TPM_LEFTALIGN = 0x0000
|
|
|
|
CS_VREDRAW = 0x0001
|
|
CS_HREDRAW = 0x0002
|
|
)
|
|
|
|
func WMMessageToString(msg uintptr) string {
|
|
// Convert windows message to string
|
|
switch msg {
|
|
case WM_APP:
|
|
return "WM_APP"
|
|
case WM_ACTIVATE:
|
|
return "WM_ACTIVATE"
|
|
case WM_ACTIVATEAPP:
|
|
return "WM_ACTIVATEAPP"
|
|
case WM_AFXFIRST:
|
|
return "WM_AFXFIRST"
|
|
case WM_AFXLAST:
|
|
return "WM_AFXLAST"
|
|
case WM_ASKCBFORMATNAME:
|
|
return "WM_ASKCBFORMATNAME"
|
|
case WM_CANCELJOURNAL:
|
|
return "WM_CANCELJOURNAL"
|
|
case WM_CANCELMODE:
|
|
return "WM_CANCELMODE"
|
|
case WM_CAPTURECHANGED:
|
|
return "WM_CAPTURECHANGED"
|
|
case WM_CHANGECBCHAIN:
|
|
return "WM_CHANGECBCHAIN"
|
|
case WM_CHAR:
|
|
return "WM_CHAR"
|
|
case WM_CHARTOITEM:
|
|
return "WM_CHARTOITEM"
|
|
case WM_CHILDACTIVATE:
|
|
return "WM_CHILDACTIVATE"
|
|
case WM_CLEAR:
|
|
return "WM_CLEAR"
|
|
case WM_CLOSE:
|
|
return "WM_CLOSE"
|
|
case WM_COMMAND:
|
|
return "WM_COMMAND"
|
|
case WM_COMMNOTIFY /* OBSOLETE */ :
|
|
return "WM_COMMNOTIFY"
|
|
case WM_COMPACTING:
|
|
return "WM_COMPACTING"
|
|
case WM_COMPAREITEM:
|
|
return "WM_COMPAREITEM"
|
|
case WM_CONTEXTMENU:
|
|
return "WM_CONTEXTMENU"
|
|
case WM_COPY:
|
|
return "WM_COPY"
|
|
case WM_COPYDATA:
|
|
return "WM_COPYDATA"
|
|
case WM_CREATE:
|
|
return "WM_CREATE"
|
|
case WM_CTLCOLORBTN:
|
|
return "WM_CTLCOLORBTN"
|
|
case WM_CTLCOLORDLG:
|
|
return "WM_CTLCOLORDLG"
|
|
case WM_CTLCOLOREDIT:
|
|
return "WM_CTLCOLOREDIT"
|
|
case WM_CTLCOLORLISTBOX:
|
|
return "WM_CTLCOLORLISTBOX"
|
|
case WM_CTLCOLORMSGBOX:
|
|
return "WM_CTLCOLORMSGBOX"
|
|
case WM_CTLCOLORSCROLLBAR:
|
|
return "WM_CTLCOLORSCROLLBAR"
|
|
case WM_CTLCOLORSTATIC:
|
|
return "WM_CTLCOLORSTATIC"
|
|
case WM_CUT:
|
|
return "WM_CUT"
|
|
case WM_DEADCHAR:
|
|
return "WM_DEADCHAR"
|
|
case WM_DELETEITEM:
|
|
return "WM_DELETEITEM"
|
|
case WM_DESTROY:
|
|
return "WM_DESTROY"
|
|
case WM_DESTROYCLIPBOARD:
|
|
return "WM_DESTROYCLIPBOARD"
|
|
case WM_DEVICECHANGE:
|
|
return "WM_DEVICECHANGE"
|
|
case WM_DEVMODECHANGE:
|
|
return "WM_DEVMODECHANGE"
|
|
case WM_DISPLAYCHANGE:
|
|
return "WM_DISPLAYCHANGE"
|
|
case WM_DRAWCLIPBOARD:
|
|
return "WM_DRAWCLIPBOARD"
|
|
case WM_DRAWITEM:
|
|
return "WM_DRAWITEM"
|
|
case WM_DROPFILES:
|
|
return "WM_DROPFILES"
|
|
case WM_ENABLE:
|
|
return "WM_ENABLE"
|
|
case WM_ENDSESSION:
|
|
return "WM_ENDSESSION"
|
|
case WM_ENTERIDLE:
|
|
return "WM_ENTERIDLE"
|
|
case WM_ENTERMENULOOP:
|
|
return "WM_ENTERMENULOOP"
|
|
case WM_ENTERSIZEMOVE:
|
|
return "WM_ENTERSIZEMOVE"
|
|
case WM_ERASEBKGND:
|
|
return "WM_ERASEBKGND"
|
|
case WM_EXITMENULOOP:
|
|
return "WM_EXITMENULOOP"
|
|
case WM_EXITSIZEMOVE:
|
|
return "WM_EXITSIZEMOVE"
|
|
case WM_FONTCHANGE:
|
|
return "WM_FONTCHANGE"
|
|
case WM_GETDLGCODE:
|
|
return "WM_GETDLGCODE"
|
|
case WM_GETFONT:
|
|
return "WM_GETFONT"
|
|
case WM_GETHOTKEY:
|
|
return "WM_GETHOTKEY"
|
|
case WM_GETICON:
|
|
return "WM_GETICON"
|
|
case WM_GETMINMAXINFO:
|
|
return "WM_GETMINMAXINFO"
|
|
case WM_GETTEXT:
|
|
return "WM_GETTEXT"
|
|
case WM_GETTEXTLENGTH:
|
|
return "WM_GETTEXTLENGTH"
|
|
case WM_HANDHELDFIRST:
|
|
return "WM_HANDHELDFIRST"
|
|
case WM_HANDHELDLAST:
|
|
return "WM_HANDHELDLAST"
|
|
case WM_HELP:
|
|
return "WM_HELP"
|
|
case WM_HOTKEY:
|
|
return "WM_HOTKEY"
|
|
case WM_HSCROLL:
|
|
return "WM_HSCROLL"
|
|
case WM_HSCROLLCLIPBOARD:
|
|
return "WM_HSCROLLCLIPBOARD"
|
|
case WM_ICONERASEBKGND:
|
|
return "WM_ICONERASEBKGND"
|
|
case WM_INITDIALOG:
|
|
return "WM_INITDIALOG"
|
|
case WM_INITMENU:
|
|
return "WM_INITMENU"
|
|
case WM_INITMENUPOPUP:
|
|
return "WM_INITMENUPOPUP"
|
|
case WM_INPUT:
|
|
return "WM_INPUT"
|
|
case WM_INPUTLANGCHANGE:
|
|
return "WM_INPUTLANGCHANGE"
|
|
case WM_INPUTLANGCHANGEREQUEST:
|
|
return "WM_INPUTLANGCHANGEREQUEST"
|
|
case WM_KEYDOWN:
|
|
return "WM_KEYDOWN"
|
|
case WM_KEYUP:
|
|
return "WM_KEYUP"
|
|
case WM_KILLFOCUS:
|
|
return "WM_KILLFOCUS"
|
|
case WM_MDIACTIVATE:
|
|
return "WM_MDIACTIVATE"
|
|
case WM_MDICASCADE:
|
|
return "WM_MDICASCADE"
|
|
case WM_MDICREATE:
|
|
return "WM_MDICREATE"
|
|
case WM_MDIDESTROY:
|
|
return "WM_MDIDESTROY"
|
|
case WM_MDIGETACTIVE:
|
|
return "WM_MDIGETACTIVE"
|
|
case WM_MDIICONARRANGE:
|
|
return "WM_MDIICONARRANGE"
|
|
case WM_MDIMAXIMIZE:
|
|
return "WM_MDIMAXIMIZE"
|
|
case WM_MDINEXT:
|
|
return "WM_MDINEXT"
|
|
case WM_MDIREFRESHMENU:
|
|
return "WM_MDIREFRESHMENU"
|
|
case WM_MDIRESTORE:
|
|
return "WM_MDIRESTORE"
|
|
case WM_MDISETMENU:
|
|
return "WM_MDISETMENU"
|
|
case WM_MDITILE:
|
|
return "WM_MDITILE"
|
|
case WM_MEASUREITEM:
|
|
return "WM_MEASUREITEM"
|
|
case WM_GETOBJECT:
|
|
return "WM_GETOBJECT"
|
|
case WM_CHANGEUISTATE:
|
|
return "WM_CHANGEUISTATE"
|
|
case WM_UPDATEUISTATE:
|
|
return "WM_UPDATEUISTATE"
|
|
case WM_QUERYUISTATE:
|
|
return "WM_QUERYUISTATE"
|
|
case WM_UNINITMENUPOPUP:
|
|
return "WM_UNINITMENUPOPUP"
|
|
case WM_MENURBUTTONUP:
|
|
return "WM_MENURBUTTONUP"
|
|
case WM_MENUCOMMAND:
|
|
return "WM_MENUCOMMAND"
|
|
case WM_MENUGETOBJECT:
|
|
return "WM_MENUGETOBJECT"
|
|
case WM_MENUDRAG:
|
|
return "WM_MENUDRAG"
|
|
case WM_APPCOMMAND:
|
|
return "WM_APPCOMMAND"
|
|
case WM_MENUCHAR:
|
|
return "WM_MENUCHAR"
|
|
case WM_MENUSELECT:
|
|
return "WM_MENUSELECT"
|
|
case WM_MOVE:
|
|
return "WM_MOVE"
|
|
case WM_MOVING:
|
|
return "WM_MOVING"
|
|
case WM_NCACTIVATE:
|
|
return "WM_NCACTIVATE"
|
|
case WM_NCCALCSIZE:
|
|
return "WM_NCCALCSIZE"
|
|
case WM_NCCREATE:
|
|
return "WM_NCCREATE"
|
|
case WM_NCDESTROY:
|
|
return "WM_NCDESTROY"
|
|
case WM_NCHITTEST:
|
|
return "WM_NCHITTEST"
|
|
case WM_NCLBUTTONDBLCLK:
|
|
return "WM_NCLBUTTONDBLCLK"
|
|
case WM_NCLBUTTONDOWN:
|
|
return "WM_NCLBUTTONDOWN"
|
|
case WM_NCLBUTTONUP:
|
|
return "WM_NCLBUTTONUP"
|
|
case WM_NCMBUTTONDBLCLK:
|
|
return "WM_NCMBUTTONDBLCLK"
|
|
case WM_NCMBUTTONDOWN:
|
|
return "WM_NCMBUTTONDOWN"
|
|
case WM_NCMBUTTONUP:
|
|
return "WM_NCMBUTTONUP"
|
|
case WM_NCXBUTTONDOWN:
|
|
return "WM_NCXBUTTONDOWN"
|
|
case WM_NCXBUTTONUP:
|
|
return "WM_NCXBUTTONUP"
|
|
case WM_NCXBUTTONDBLCLK:
|
|
return "WM_NCXBUTTONDBLCLK"
|
|
case WM_NCMOUSEHOVER:
|
|
return "WM_NCMOUSEHOVER"
|
|
case WM_NCMOUSELEAVE:
|
|
return "WM_NCMOUSELEAVE"
|
|
case WM_NCMOUSEMOVE:
|
|
return "WM_NCMOUSEMOVE"
|
|
case WM_NCPAINT:
|
|
return "WM_NCPAINT"
|
|
case WM_NCRBUTTONDBLCLK:
|
|
return "WM_NCRBUTTONDBLCLK"
|
|
case WM_NCRBUTTONDOWN:
|
|
return "WM_NCRBUTTONDOWN"
|
|
case WM_NCRBUTTONUP:
|
|
return "WM_NCRBUTTONUP"
|
|
case WM_NEXTDLGCTL:
|
|
return "WM_NEXTDLGCTL"
|
|
case WM_NEXTMENU:
|
|
return "WM_NEXTMENU"
|
|
case WM_NOTIFY:
|
|
return "WM_NOTIFY"
|
|
case WM_NOTIFYFORMAT:
|
|
return "WM_NOTIFYFORMAT"
|
|
case WM_NULL:
|
|
return "WM_NULL"
|
|
case WM_PAINT:
|
|
return "WM_PAINT"
|
|
case WM_PAINTCLIPBOARD:
|
|
return "WM_PAINTCLIPBOARD"
|
|
case WM_PAINTICON:
|
|
return "WM_PAINTICON"
|
|
case WM_PALETTECHANGED:
|
|
return "WM_PALETTECHANGED"
|
|
case WM_PALETTEISCHANGING:
|
|
return "WM_PALETTEISCHANGING"
|
|
case WM_PARENTNOTIFY:
|
|
return "WM_PARENTNOTIFY"
|
|
case WM_PASTE:
|
|
return "WM_PASTE"
|
|
case WM_PENWINFIRST:
|
|
return "WM_PENWINFIRST"
|
|
case WM_PENWINLAST:
|
|
return "WM_PENWINLAST"
|
|
case WM_POWER:
|
|
return "WM_POWER"
|
|
case WM_PRINT:
|
|
return "WM_PRINT"
|
|
case WM_PRINTCLIENT:
|
|
return "WM_PRINTCLIENT"
|
|
case WM_QUERYDRAGICON:
|
|
return "WM_QUERYDRAGICON"
|
|
case WM_QUERYENDSESSION:
|
|
return "WM_QUERYENDSESSION"
|
|
case WM_QUERYNEWPALETTE:
|
|
return "WM_QUERYNEWPALETTE"
|
|
case WM_QUERYOPEN:
|
|
return "WM_QUERYOPEN"
|
|
case WM_QUEUESYNC:
|
|
return "WM_QUEUESYNC"
|
|
case WM_QUIT:
|
|
return "WM_QUIT"
|
|
case WM_RENDERALLFORMATS:
|
|
return "WM_RENDERALLFORMATS"
|
|
case WM_RENDERFORMAT:
|
|
return "WM_RENDERFORMAT"
|
|
case WM_SETCURSOR:
|
|
return "WM_SETCURSOR"
|
|
case WM_SETFOCUS:
|
|
return "WM_SETFOCUS"
|
|
case WM_SETFONT:
|
|
return "WM_SETFONT"
|
|
case WM_SETHOTKEY:
|
|
return "WM_SETHOTKEY"
|
|
case WM_SETICON:
|
|
return "WM_SETICON"
|
|
case WM_SETREDRAW:
|
|
return "WM_SETREDRAW"
|
|
case WM_SETTEXT:
|
|
return "WM_SETTEXT"
|
|
case WM_SETTINGCHANGE:
|
|
return "WM_SETTINGCHANGE"
|
|
case WM_SHOWWINDOW:
|
|
return "WM_SHOWWINDOW"
|
|
case WM_SIZE:
|
|
return "WM_SIZE"
|
|
case WM_SIZECLIPBOARD:
|
|
return "WM_SIZECLIPBOARD"
|
|
case WM_SIZING:
|
|
return "WM_SIZING"
|
|
case WM_SPOOLERSTATUS:
|
|
return "WM_SPOOLERSTATUS"
|
|
case WM_STYLECHANGED:
|
|
return "WM_STYLECHANGED"
|
|
case WM_STYLECHANGING:
|
|
return "WM_STYLECHANGING"
|
|
case WM_SYSCHAR:
|
|
return "WM_SYSCHAR"
|
|
case WM_SYSCOLORCHANGE:
|
|
return "WM_SYSCOLORCHANGE"
|
|
case WM_SYSCOMMAND:
|
|
return "WM_SYSCOMMAND"
|
|
case WM_SYSDEADCHAR:
|
|
return "WM_SYSDEADCHAR"
|
|
case WM_SYSKEYDOWN:
|
|
return "WM_SYSKEYDOWN"
|
|
case WM_SYSKEYUP:
|
|
return "WM_SYSKEYUP"
|
|
case WM_TCARD:
|
|
return "WM_TCARD"
|
|
case WM_THEMECHANGED:
|
|
return "WM_THEMECHANGED"
|
|
case WM_TIMECHANGE:
|
|
return "WM_TIMECHANGE"
|
|
case WM_TIMER:
|
|
return "WM_TIMER"
|
|
case WM_UNDO:
|
|
return "WM_UNDO"
|
|
case WM_USER:
|
|
return "WM_USER"
|
|
case WM_USERCHANGED:
|
|
return "WM_USERCHANGED"
|
|
case WM_VKEYTOITEM:
|
|
return "WM_VKEYTOITEM"
|
|
case WM_VSCROLL:
|
|
return "WM_VSCROLL"
|
|
case WM_VSCROLLCLIPBOARD:
|
|
return "WM_VSCROLLCLIPBOARD"
|
|
case WM_WINDOWPOSCHANGED:
|
|
return "WM_WINDOWPOSCHANGED"
|
|
case WM_WINDOWPOSCHANGING:
|
|
return "WM_WINDOWPOSCHANGING"
|
|
case WM_KEYLAST:
|
|
return "WM_KEYLAST"
|
|
case WM_SYNCPAINT:
|
|
return "WM_SYNCPAINT"
|
|
case WM_MOUSEACTIVATE:
|
|
return "WM_MOUSEACTIVATE"
|
|
case WM_MOUSEMOVE:
|
|
return "WM_MOUSEMOVE"
|
|
case WM_LBUTTONDOWN:
|
|
return "WM_LBUTTONDOWN"
|
|
case WM_LBUTTONUP:
|
|
return "WM_LBUTTONUP"
|
|
case WM_LBUTTONDBLCLK:
|
|
return "WM_LBUTTONDBLCLK"
|
|
case WM_RBUTTONDOWN:
|
|
return "WM_RBUTTONDOWN"
|
|
case WM_RBUTTONUP:
|
|
return "WM_RBUTTONUP"
|
|
case WM_RBUTTONDBLCLK:
|
|
return "WM_RBUTTONDBLCLK"
|
|
case WM_MBUTTONDOWN:
|
|
return "WM_MBUTTONDOWN"
|
|
case WM_MBUTTONUP:
|
|
return "WM_MBUTTONUP"
|
|
case WM_MBUTTONDBLCLK:
|
|
return "WM_MBUTTONDBLCLK"
|
|
case WM_MOUSEWHEEL:
|
|
return "WM_MOUSEWHEEL"
|
|
case WM_XBUTTONDOWN:
|
|
return "WM_XBUTTONDOWN"
|
|
case WM_XBUTTONUP:
|
|
return "WM_XBUTTONUP"
|
|
case WM_MOUSELAST:
|
|
return "WM_MOUSELAST"
|
|
case WM_MOUSEHOVER:
|
|
return "WM_MOUSEHOVER"
|
|
case WM_MOUSELEAVE:
|
|
return "WM_MOUSELEAVE"
|
|
case WM_CLIPBOARDUPDATE:
|
|
return "WM_CLIPBOARDUPDATE"
|
|
default:
|
|
return fmt.Sprintf("0x%08x", msg)
|
|
}
|
|
}
|
|
|
|
var windowsVersion, _ = operatingsystem.GetWindowsVersionInfo()
|
|
|
|
func IsWindowsVersionAtLeast(major, minor, buildNumber int) bool {
|
|
return windowsVersion.Major >= major &&
|
|
windowsVersion.Minor >= minor &&
|
|
windowsVersion.Build >= buildNumber
|
|
}
|
|
|
|
type WindowProc func(hwnd HWND, msg uint32, wparam, lparam uintptr) uintptr
|
|
|
|
func GetModuleHandle(value uintptr) uintptr {
|
|
result, _, _ := procGetModuleHandle.Call(value)
|
|
return result
|
|
}
|
|
|
|
func GetMessage(msg *MSG) uintptr {
|
|
rt, _, _ := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), 0, 0, 0)
|
|
return rt
|
|
}
|
|
|
|
func PostMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
|
|
ret, _, _ := procPostMessage.Call(
|
|
uintptr(hwnd),
|
|
uintptr(msg),
|
|
wParam,
|
|
lParam)
|
|
|
|
return ret
|
|
}
|
|
|
|
func ShellNotifyIcon(cmd uintptr, nid *NOTIFYICONDATA) bool {
|
|
ret, _, _ := procShellNotifyIcon.Call(cmd, uintptr(unsafe.Pointer(nid)))
|
|
return ret == 1
|
|
}
|
|
|
|
func IsDialogMessage(hwnd HWND, msg *MSG) uintptr {
|
|
ret, _, _ := procIsDialogMessage.Call(uintptr(hwnd), uintptr(unsafe.Pointer(msg)))
|
|
return ret
|
|
}
|
|
|
|
func TranslateMessage(msg *MSG) uintptr {
|
|
ret, _, _ := procTranslateMessage.Call(uintptr(unsafe.Pointer(msg)))
|
|
return ret
|
|
}
|
|
|
|
func DispatchMessage(msg *MSG) uintptr {
|
|
ret, _, _ := procDispatchMessage.Call(uintptr(unsafe.Pointer(msg)))
|
|
return ret
|
|
}
|
|
|
|
func PostQuitMessage(exitCode int32) {
|
|
procPostQuitMessage.Call(uintptr(exitCode))
|
|
}
|
|
|
|
func LoHiWords(input uint32) (uint16, uint16) {
|
|
return uint16(input & 0xffff), uint16(input >> 16 & 0xffff)
|
|
}
|