github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/platform/win32/consts.go (about)

     1  //go:build windows
     2  
     3  package win32
     4  
     5  import (
     6  	"fmt"
     7  	"syscall"
     8  	"unsafe"
     9  
    10  	"github.com/AlpineAIO/wails/v2/internal/system/operatingsystem"
    11  	"golang.org/x/sys/windows"
    12  )
    13  
    14  var (
    15  	modKernel32         = syscall.NewLazyDLL("kernel32.dll")
    16  	procGetModuleHandle = modKernel32.NewProc("GetModuleHandleW")
    17  
    18  	moduser32                         = syscall.NewLazyDLL("user32.dll")
    19  	procRegisterClassEx               = moduser32.NewProc("RegisterClassExW")
    20  	procLoadIcon                      = moduser32.NewProc("LoadIconW")
    21  	procLoadCursor                    = moduser32.NewProc("LoadCursorW")
    22  	procCreateWindowEx                = moduser32.NewProc("CreateWindowExW")
    23  	procPostMessage                   = moduser32.NewProc("PostMessageW")
    24  	procGetCursorPos                  = moduser32.NewProc("GetCursorPos")
    25  	procSetForegroundWindow           = moduser32.NewProc("SetForegroundWindow")
    26  	procCreatePopupMenu               = moduser32.NewProc("CreatePopupMenu")
    27  	procTrackPopupMenu                = moduser32.NewProc("TrackPopupMenu")
    28  	procDestroyMenu                   = moduser32.NewProc("DestroyMenu")
    29  	procAppendMenuW                   = moduser32.NewProc("AppendMenuW")
    30  	procCheckMenuItem                 = moduser32.NewProc("CheckMenuItem")
    31  	procCheckMenuRadioItem            = moduser32.NewProc("CheckMenuRadioItem")
    32  	procCreateIconFromResourceEx      = moduser32.NewProc("CreateIconFromResourceEx")
    33  	procGetMessageW                   = moduser32.NewProc("GetMessageW")
    34  	procIsDialogMessage               = moduser32.NewProc("IsDialogMessageW")
    35  	procTranslateMessage              = moduser32.NewProc("TranslateMessage")
    36  	procDispatchMessage               = moduser32.NewProc("DispatchMessageW")
    37  	procPostQuitMessage               = moduser32.NewProc("PostQuitMessage")
    38  	procSystemParametersInfo          = moduser32.NewProc("SystemParametersInfoW")
    39  	procSetWindowCompositionAttribute = moduser32.NewProc("SetWindowCompositionAttribute")
    40  	procGetKeyState                   = moduser32.NewProc("GetKeyState")
    41  	procCreateAcceleratorTable        = moduser32.NewProc("CreateAcceleratorTableW")
    42  	procTranslateAccelerator          = moduser32.NewProc("TranslateAcceleratorW")
    43  
    44  	modshell32          = syscall.NewLazyDLL("shell32.dll")
    45  	procShellNotifyIcon = modshell32.NewProc("Shell_NotifyIconW")
    46  
    47  	moddwmapi                 = syscall.NewLazyDLL("dwmapi.dll")
    48  	procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
    49  
    50  	moduxtheme         = syscall.NewLazyDLL("uxtheme.dll")
    51  	procSetWindowTheme = moduxtheme.NewProc("SetWindowTheme")
    52  
    53  	AllowDarkModeForWindow func(HWND, bool) uintptr
    54  	SetPreferredAppMode    func(int32) uintptr
    55  )
    56  
    57  type PreferredAppMode = int32
    58  
    59  const (
    60  	PreferredAppModeDefault PreferredAppMode = iota
    61  	PreferredAppModeAllowDark
    62  	PreferredAppModeForceDark
    63  	PreferredAppModeForceLight
    64  	PreferredAppModeMax
    65  )
    66  
    67  /*
    68  RtlGetNtVersionNumbers = void (LPDWORD major, LPDWORD minor, LPDWORD build) // 1809 17763
    69  ShouldAppsUseDarkMode = bool () // ordinal 132
    70  AllowDarkModeForWindow = bool (HWND hWnd, bool allow) // ordinal 133
    71  AllowDarkModeForApp = bool (bool allow) // ordinal 135, removed since 18334
    72  FlushMenuThemes = void () // ordinal 136
    73  RefreshImmersiveColorPolicyState = void () // ordinal 104
    74  IsDarkModeAllowedForWindow = bool (HWND hWnd) // ordinal 137
    75  GetIsImmersiveColorUsingHighContrast = bool (IMMERSIVE_HC_CACHE_MODE mode) // ordinal 106
    76  OpenNcThemeData = HTHEME (HWND hWnd, LPCWSTR pszClassList) // ordinal 49
    77  // Insider 18290
    78  ShouldSystemUseDarkMode = bool () // ordinal 138
    79  // Insider 18334
    80  SetPreferredAppMode = PreferredAppMode (PreferredAppMode appMode) // ordinal 135, since 18334
    81  IsDarkModeAllowedForApp = bool () // ordinal 139
    82  */
    83  func init() {
    84  	if IsWindowsVersionAtLeast(10, 0, 18334) {
    85  
    86  		// AllowDarkModeForWindow is only available on Windows 10+
    87  		uxtheme, err := windows.LoadLibrary("uxtheme.dll")
    88  		if err == nil {
    89  			procAllowDarkModeForWindow, err := windows.GetProcAddressByOrdinal(uxtheme, uintptr(133))
    90  			if err == nil {
    91  				AllowDarkModeForWindow = func(hwnd HWND, allow bool) uintptr {
    92  					var allowInt int32
    93  					if allow {
    94  						allowInt = 1
    95  					}
    96  					ret, _, _ := syscall.SyscallN(procAllowDarkModeForWindow, uintptr(hwnd), uintptr(allowInt))
    97  					return ret
    98  				}
    99  			}
   100  		}
   101  
   102  		// SetPreferredAppMode is only available on Windows 10+
   103  		procSetPreferredAppMode, err := windows.GetProcAddressByOrdinal(uxtheme, uintptr(135))
   104  		if err == nil {
   105  			SetPreferredAppMode = func(mode int32) uintptr {
   106  				ret, _, _ := syscall.SyscallN(procSetPreferredAppMode, uintptr(mode))
   107  				return ret
   108  			}
   109  			SetPreferredAppMode(PreferredAppModeAllowDark)
   110  		}
   111  	}
   112  
   113  }
   114  
   115  type HANDLE uintptr
   116  type HINSTANCE = HANDLE
   117  type HICON = HANDLE
   118  type HCURSOR = HANDLE
   119  type HBRUSH = HANDLE
   120  type HWND = HANDLE
   121  type HMENU = HANDLE
   122  type DWORD = uint32
   123  type ATOM uint16
   124  type MenuID uint16
   125  
   126  const (
   127  	WM_APP                    = 32768
   128  	WM_ACTIVATE               = 6
   129  	WM_ACTIVATEAPP            = 28
   130  	WM_AFXFIRST               = 864
   131  	WM_AFXLAST                = 895
   132  	WM_ASKCBFORMATNAME        = 780
   133  	WM_CANCELJOURNAL          = 75
   134  	WM_CANCELMODE             = 31
   135  	WM_CAPTURECHANGED         = 533
   136  	WM_CHANGECBCHAIN          = 781
   137  	WM_CHAR                   = 258
   138  	WM_CHARTOITEM             = 47
   139  	WM_CHILDACTIVATE          = 34
   140  	WM_CLEAR                  = 771
   141  	WM_CLOSE                  = 16
   142  	WM_COMMAND                = 273
   143  	WM_COMMNOTIFY             = 68 /* OBSOLETE */
   144  	WM_COMPACTING             = 65
   145  	WM_COMPAREITEM            = 57
   146  	WM_CONTEXTMENU            = 123
   147  	WM_COPY                   = 769
   148  	WM_COPYDATA               = 74
   149  	WM_CREATE                 = 1
   150  	WM_CTLCOLORBTN            = 309
   151  	WM_CTLCOLORDLG            = 310
   152  	WM_CTLCOLOREDIT           = 307
   153  	WM_CTLCOLORLISTBOX        = 308
   154  	WM_CTLCOLORMSGBOX         = 306
   155  	WM_CTLCOLORSCROLLBAR      = 311
   156  	WM_CTLCOLORSTATIC         = 312
   157  	WM_CUT                    = 768
   158  	WM_DEADCHAR               = 259
   159  	WM_DELETEITEM             = 45
   160  	WM_DESTROY                = 2
   161  	WM_DESTROYCLIPBOARD       = 775
   162  	WM_DEVICECHANGE           = 537
   163  	WM_DEVMODECHANGE          = 27
   164  	WM_DISPLAYCHANGE          = 126
   165  	WM_DRAWCLIPBOARD          = 776
   166  	WM_DRAWITEM               = 43
   167  	WM_DROPFILES              = 563
   168  	WM_ENABLE                 = 10
   169  	WM_ENDSESSION             = 22
   170  	WM_ENTERIDLE              = 289
   171  	WM_ENTERMENULOOP          = 529
   172  	WM_ENTERSIZEMOVE          = 561
   173  	WM_ERASEBKGND             = 20
   174  	WM_EXITMENULOOP           = 530
   175  	WM_EXITSIZEMOVE           = 562
   176  	WM_FONTCHANGE             = 29
   177  	WM_GETDLGCODE             = 135
   178  	WM_GETFONT                = 49
   179  	WM_GETHOTKEY              = 51
   180  	WM_GETICON                = 127
   181  	WM_GETMINMAXINFO          = 36
   182  	WM_GETTEXT                = 13
   183  	WM_GETTEXTLENGTH          = 14
   184  	WM_HANDHELDFIRST          = 856
   185  	WM_HANDHELDLAST           = 863
   186  	WM_HELP                   = 83
   187  	WM_HOTKEY                 = 786
   188  	WM_HSCROLL                = 276
   189  	WM_HSCROLLCLIPBOARD       = 782
   190  	WM_ICONERASEBKGND         = 39
   191  	WM_INITDIALOG             = 272
   192  	WM_INITMENU               = 278
   193  	WM_INITMENUPOPUP          = 279
   194  	WM_INPUT                  = 0x00FF
   195  	WM_INPUTLANGCHANGE        = 81
   196  	WM_INPUTLANGCHANGEREQUEST = 80
   197  	WM_KEYDOWN                = 256
   198  	WM_KEYUP                  = 257
   199  	WM_KILLFOCUS              = 8
   200  	WM_MDIACTIVATE            = 546
   201  	WM_MDICASCADE             = 551
   202  	WM_MDICREATE              = 544
   203  	WM_MDIDESTROY             = 545
   204  	WM_MDIGETACTIVE           = 553
   205  	WM_MDIICONARRANGE         = 552
   206  	WM_MDIMAXIMIZE            = 549
   207  	WM_MDINEXT                = 548
   208  	WM_MDIREFRESHMENU         = 564
   209  	WM_MDIRESTORE             = 547
   210  	WM_MDISETMENU             = 560
   211  	WM_MDITILE                = 550
   212  	WM_MEASUREITEM            = 44
   213  	WM_GETOBJECT              = 0x003D
   214  	WM_CHANGEUISTATE          = 0x0127
   215  	WM_UPDATEUISTATE          = 0x0128
   216  	WM_QUERYUISTATE           = 0x0129
   217  	WM_UNINITMENUPOPUP        = 0x0125
   218  	WM_MENURBUTTONUP          = 290
   219  	WM_MENUCOMMAND            = 0x0126
   220  	WM_MENUGETOBJECT          = 0x0124
   221  	WM_MENUDRAG               = 0x0123
   222  	WM_APPCOMMAND             = 0x0319
   223  	WM_MENUCHAR               = 288
   224  	WM_MENUSELECT             = 287
   225  	WM_MOVE                   = 3
   226  	WM_MOVING                 = 534
   227  	WM_NCACTIVATE             = 134
   228  	WM_NCCALCSIZE             = 131
   229  	WM_NCCREATE               = 129
   230  	WM_NCDESTROY              = 130
   231  	WM_NCHITTEST              = 132
   232  	WM_NCLBUTTONDBLCLK        = 163
   233  	WM_NCLBUTTONDOWN          = 161
   234  	WM_NCLBUTTONUP            = 162
   235  	WM_NCMBUTTONDBLCLK        = 169
   236  	WM_NCMBUTTONDOWN          = 167
   237  	WM_NCMBUTTONUP            = 168
   238  	WM_NCXBUTTONDOWN          = 171
   239  	WM_NCXBUTTONUP            = 172
   240  	WM_NCXBUTTONDBLCLK        = 173
   241  	WM_NCMOUSEHOVER           = 0x02A0
   242  	WM_NCMOUSELEAVE           = 0x02A2
   243  	WM_NCMOUSEMOVE            = 160
   244  	WM_NCPAINT                = 133
   245  	WM_NCRBUTTONDBLCLK        = 166
   246  	WM_NCRBUTTONDOWN          = 164
   247  	WM_NCRBUTTONUP            = 165
   248  	WM_NEXTDLGCTL             = 40
   249  	WM_NEXTMENU               = 531
   250  	WM_NOTIFY                 = 78
   251  	WM_NOTIFYFORMAT           = 85
   252  	WM_NULL                   = 0
   253  	WM_PAINT                  = 15
   254  	WM_PAINTCLIPBOARD         = 777
   255  	WM_PAINTICON              = 38
   256  	WM_PALETTECHANGED         = 785
   257  	WM_PALETTEISCHANGING      = 784
   258  	WM_PARENTNOTIFY           = 528
   259  	WM_PASTE                  = 770
   260  	WM_PENWINFIRST            = 896
   261  	WM_PENWINLAST             = 911
   262  	WM_POWER                  = 72
   263  	WM_PRINT                  = 791
   264  	WM_PRINTCLIENT            = 792
   265  	WM_QUERYDRAGICON          = 55
   266  	WM_QUERYENDSESSION        = 17
   267  	WM_QUERYNEWPALETTE        = 783
   268  	WM_QUERYOPEN              = 19
   269  	WM_QUEUESYNC              = 35
   270  	WM_QUIT                   = 18
   271  	WM_RENDERALLFORMATS       = 774
   272  	WM_RENDERFORMAT           = 773
   273  	WM_SETCURSOR              = 32
   274  	WM_SETFOCUS               = 7
   275  	WM_SETFONT                = 48
   276  	WM_SETHOTKEY              = 50
   277  	WM_SETICON                = 128
   278  	WM_SETREDRAW              = 11
   279  	WM_SETTEXT                = 12
   280  	WM_SETTINGCHANGE          = 26
   281  	WM_SHOWWINDOW             = 24
   282  	WM_SIZE                   = 5
   283  	WM_SIZECLIPBOARD          = 779
   284  	WM_SIZING                 = 532
   285  	WM_SPOOLERSTATUS          = 42
   286  	WM_STYLECHANGED           = 125
   287  	WM_STYLECHANGING          = 124
   288  	WM_SYSCHAR                = 262
   289  	WM_SYSCOLORCHANGE         = 21
   290  	WM_SYSCOMMAND             = 274
   291  	WM_SYSDEADCHAR            = 263
   292  	WM_SYSKEYDOWN             = 260
   293  	WM_SYSKEYUP               = 261
   294  	WM_TCARD                  = 82
   295  	WM_THEMECHANGED           = 794
   296  	WM_TIMECHANGE             = 30
   297  	WM_TIMER                  = 275
   298  	WM_UNDO                   = 772
   299  	WM_USER                   = 1024
   300  	WM_USERCHANGED            = 84
   301  	WM_VKEYTOITEM             = 46
   302  	WM_VSCROLL                = 277
   303  	WM_VSCROLLCLIPBOARD       = 778
   304  	WM_WINDOWPOSCHANGED       = 71
   305  	WM_WINDOWPOSCHANGING      = 70
   306  	WM_WININICHANGE           = 26
   307  	WM_KEYFIRST               = 256
   308  	WM_KEYLAST                = 264
   309  	WM_SYNCPAINT              = 136
   310  	WM_MOUSEACTIVATE          = 33
   311  	WM_MOUSEMOVE              = 512
   312  	WM_LBUTTONDOWN            = 513
   313  	WM_LBUTTONUP              = 514
   314  	WM_LBUTTONDBLCLK          = 515
   315  	WM_RBUTTONDOWN            = 516
   316  	WM_RBUTTONUP              = 517
   317  	WM_RBUTTONDBLCLK          = 518
   318  	WM_MBUTTONDOWN            = 519
   319  	WM_MBUTTONUP              = 520
   320  	WM_MBUTTONDBLCLK          = 521
   321  	WM_MOUSEWHEEL             = 522
   322  	WM_MOUSEFIRST             = 512
   323  	WM_XBUTTONDOWN            = 523
   324  	WM_XBUTTONUP              = 524
   325  	WM_XBUTTONDBLCLK          = 525
   326  	WM_MOUSELAST              = 525
   327  	WM_MOUSEHOVER             = 0x2A1
   328  	WM_MOUSELEAVE             = 0x2A3
   329  	WM_CLIPBOARDUPDATE        = 0x031D
   330  
   331  	WS_EX_APPWINDOW           = 0x00040000
   332  	WS_OVERLAPPEDWINDOW       = 0x00000000 | 0x00C00000 | 0x00080000 | 0x00040000 | 0x00020000 | 0x00010000
   333  	WS_EX_NOREDIRECTIONBITMAP = 0x00200000
   334  	CW_USEDEFAULT             = ^0x7fffffff
   335  
   336  	NIM_ADD        = 0x00000000
   337  	NIM_MODIFY     = 0x00000001
   338  	NIM_DELETE     = 0x00000002
   339  	NIM_SETVERSION = 0x00000004
   340  
   341  	NIF_MESSAGE = 0x00000001
   342  	NIF_ICON    = 0x00000002
   343  	NIF_TIP     = 0x00000004
   344  	NIF_STATE   = 0x00000008
   345  	NIF_INFO    = 0x00000010
   346  
   347  	NIS_HIDDEN = 0x00000001
   348  
   349  	NIIF_NONE               = 0x00000000
   350  	NIIF_INFO               = 0x00000001
   351  	NIIF_WARNING            = 0x00000002
   352  	NIIF_ERROR              = 0x00000003
   353  	NIIF_USER               = 0x00000004
   354  	NIIF_NOSOUND            = 0x00000010
   355  	NIIF_LARGE_ICON         = 0x00000020
   356  	NIIF_RESPECT_QUIET_TIME = 0x00000080
   357  	NIIF_ICON_MASK          = 0x0000000F
   358  
   359  	IMAGE_BITMAP    = 0
   360  	IMAGE_ICON      = 1
   361  	LR_LOADFROMFILE = 0x00000010
   362  	LR_DEFAULTSIZE  = 0x00000040
   363  
   364  	IDC_ARROW     = 32512
   365  	COLOR_WINDOW  = 5
   366  	COLOR_BTNFACE = 15
   367  
   368  	GWLP_USERDATA       = -21
   369  	WS_CLIPSIBLINGS     = 0x04000000
   370  	WS_EX_CONTROLPARENT = 0x00010000
   371  
   372  	HWND_MESSAGE       = ^HWND(2)
   373  	NOTIFYICON_VERSION = 4
   374  
   375  	IDI_APPLICATION = 32512
   376  
   377  	MenuItemMsgID       = WM_APP + 1024
   378  	NotifyIconMessageId = WM_APP + iota
   379  
   380  	MF_STRING       = 0x00000000
   381  	MF_ENABLED      = 0x00000000
   382  	MF_GRAYED       = 0x00000001
   383  	MF_DISABLED     = 0x00000002
   384  	MF_SEPARATOR    = 0x00000800
   385  	MF_UNCHECKED    = 0x00000000
   386  	MF_CHECKED      = 0x00000008
   387  	MF_POPUP        = 0x00000010
   388  	MF_MENUBARBREAK = 0x00000020
   389  	MF_BYCOMMAND    = 0x00000000
   390  
   391  	TPM_LEFTALIGN = 0x0000
   392  
   393  	CS_VREDRAW = 0x0001
   394  	CS_HREDRAW = 0x0002
   395  )
   396  
   397  func WMMessageToString(msg uintptr) string {
   398  	// Convert windows message to string
   399  	switch msg {
   400  	case WM_APP:
   401  		return "WM_APP"
   402  	case WM_ACTIVATE:
   403  		return "WM_ACTIVATE"
   404  	case WM_ACTIVATEAPP:
   405  		return "WM_ACTIVATEAPP"
   406  	case WM_AFXFIRST:
   407  		return "WM_AFXFIRST"
   408  	case WM_AFXLAST:
   409  		return "WM_AFXLAST"
   410  	case WM_ASKCBFORMATNAME:
   411  		return "WM_ASKCBFORMATNAME"
   412  	case WM_CANCELJOURNAL:
   413  		return "WM_CANCELJOURNAL"
   414  	case WM_CANCELMODE:
   415  		return "WM_CANCELMODE"
   416  	case WM_CAPTURECHANGED:
   417  		return "WM_CAPTURECHANGED"
   418  	case WM_CHANGECBCHAIN:
   419  		return "WM_CHANGECBCHAIN"
   420  	case WM_CHAR:
   421  		return "WM_CHAR"
   422  	case WM_CHARTOITEM:
   423  		return "WM_CHARTOITEM"
   424  	case WM_CHILDACTIVATE:
   425  		return "WM_CHILDACTIVATE"
   426  	case WM_CLEAR:
   427  		return "WM_CLEAR"
   428  	case WM_CLOSE:
   429  		return "WM_CLOSE"
   430  	case WM_COMMAND:
   431  		return "WM_COMMAND"
   432  	case WM_COMMNOTIFY /* OBSOLETE */ :
   433  		return "WM_COMMNOTIFY"
   434  	case WM_COMPACTING:
   435  		return "WM_COMPACTING"
   436  	case WM_COMPAREITEM:
   437  		return "WM_COMPAREITEM"
   438  	case WM_CONTEXTMENU:
   439  		return "WM_CONTEXTMENU"
   440  	case WM_COPY:
   441  		return "WM_COPY"
   442  	case WM_COPYDATA:
   443  		return "WM_COPYDATA"
   444  	case WM_CREATE:
   445  		return "WM_CREATE"
   446  	case WM_CTLCOLORBTN:
   447  		return "WM_CTLCOLORBTN"
   448  	case WM_CTLCOLORDLG:
   449  		return "WM_CTLCOLORDLG"
   450  	case WM_CTLCOLOREDIT:
   451  		return "WM_CTLCOLOREDIT"
   452  	case WM_CTLCOLORLISTBOX:
   453  		return "WM_CTLCOLORLISTBOX"
   454  	case WM_CTLCOLORMSGBOX:
   455  		return "WM_CTLCOLORMSGBOX"
   456  	case WM_CTLCOLORSCROLLBAR:
   457  		return "WM_CTLCOLORSCROLLBAR"
   458  	case WM_CTLCOLORSTATIC:
   459  		return "WM_CTLCOLORSTATIC"
   460  	case WM_CUT:
   461  		return "WM_CUT"
   462  	case WM_DEADCHAR:
   463  		return "WM_DEADCHAR"
   464  	case WM_DELETEITEM:
   465  		return "WM_DELETEITEM"
   466  	case WM_DESTROY:
   467  		return "WM_DESTROY"
   468  	case WM_DESTROYCLIPBOARD:
   469  		return "WM_DESTROYCLIPBOARD"
   470  	case WM_DEVICECHANGE:
   471  		return "WM_DEVICECHANGE"
   472  	case WM_DEVMODECHANGE:
   473  		return "WM_DEVMODECHANGE"
   474  	case WM_DISPLAYCHANGE:
   475  		return "WM_DISPLAYCHANGE"
   476  	case WM_DRAWCLIPBOARD:
   477  		return "WM_DRAWCLIPBOARD"
   478  	case WM_DRAWITEM:
   479  		return "WM_DRAWITEM"
   480  	case WM_DROPFILES:
   481  		return "WM_DROPFILES"
   482  	case WM_ENABLE:
   483  		return "WM_ENABLE"
   484  	case WM_ENDSESSION:
   485  		return "WM_ENDSESSION"
   486  	case WM_ENTERIDLE:
   487  		return "WM_ENTERIDLE"
   488  	case WM_ENTERMENULOOP:
   489  		return "WM_ENTERMENULOOP"
   490  	case WM_ENTERSIZEMOVE:
   491  		return "WM_ENTERSIZEMOVE"
   492  	case WM_ERASEBKGND:
   493  		return "WM_ERASEBKGND"
   494  	case WM_EXITMENULOOP:
   495  		return "WM_EXITMENULOOP"
   496  	case WM_EXITSIZEMOVE:
   497  		return "WM_EXITSIZEMOVE"
   498  	case WM_FONTCHANGE:
   499  		return "WM_FONTCHANGE"
   500  	case WM_GETDLGCODE:
   501  		return "WM_GETDLGCODE"
   502  	case WM_GETFONT:
   503  		return "WM_GETFONT"
   504  	case WM_GETHOTKEY:
   505  		return "WM_GETHOTKEY"
   506  	case WM_GETICON:
   507  		return "WM_GETICON"
   508  	case WM_GETMINMAXINFO:
   509  		return "WM_GETMINMAXINFO"
   510  	case WM_GETTEXT:
   511  		return "WM_GETTEXT"
   512  	case WM_GETTEXTLENGTH:
   513  		return "WM_GETTEXTLENGTH"
   514  	case WM_HANDHELDFIRST:
   515  		return "WM_HANDHELDFIRST"
   516  	case WM_HANDHELDLAST:
   517  		return "WM_HANDHELDLAST"
   518  	case WM_HELP:
   519  		return "WM_HELP"
   520  	case WM_HOTKEY:
   521  		return "WM_HOTKEY"
   522  	case WM_HSCROLL:
   523  		return "WM_HSCROLL"
   524  	case WM_HSCROLLCLIPBOARD:
   525  		return "WM_HSCROLLCLIPBOARD"
   526  	case WM_ICONERASEBKGND:
   527  		return "WM_ICONERASEBKGND"
   528  	case WM_INITDIALOG:
   529  		return "WM_INITDIALOG"
   530  	case WM_INITMENU:
   531  		return "WM_INITMENU"
   532  	case WM_INITMENUPOPUP:
   533  		return "WM_INITMENUPOPUP"
   534  	case WM_INPUT:
   535  		return "WM_INPUT"
   536  	case WM_INPUTLANGCHANGE:
   537  		return "WM_INPUTLANGCHANGE"
   538  	case WM_INPUTLANGCHANGEREQUEST:
   539  		return "WM_INPUTLANGCHANGEREQUEST"
   540  	case WM_KEYDOWN:
   541  		return "WM_KEYDOWN"
   542  	case WM_KEYUP:
   543  		return "WM_KEYUP"
   544  	case WM_KILLFOCUS:
   545  		return "WM_KILLFOCUS"
   546  	case WM_MDIACTIVATE:
   547  		return "WM_MDIACTIVATE"
   548  	case WM_MDICASCADE:
   549  		return "WM_MDICASCADE"
   550  	case WM_MDICREATE:
   551  		return "WM_MDICREATE"
   552  	case WM_MDIDESTROY:
   553  		return "WM_MDIDESTROY"
   554  	case WM_MDIGETACTIVE:
   555  		return "WM_MDIGETACTIVE"
   556  	case WM_MDIICONARRANGE:
   557  		return "WM_MDIICONARRANGE"
   558  	case WM_MDIMAXIMIZE:
   559  		return "WM_MDIMAXIMIZE"
   560  	case WM_MDINEXT:
   561  		return "WM_MDINEXT"
   562  	case WM_MDIREFRESHMENU:
   563  		return "WM_MDIREFRESHMENU"
   564  	case WM_MDIRESTORE:
   565  		return "WM_MDIRESTORE"
   566  	case WM_MDISETMENU:
   567  		return "WM_MDISETMENU"
   568  	case WM_MDITILE:
   569  		return "WM_MDITILE"
   570  	case WM_MEASUREITEM:
   571  		return "WM_MEASUREITEM"
   572  	case WM_GETOBJECT:
   573  		return "WM_GETOBJECT"
   574  	case WM_CHANGEUISTATE:
   575  		return "WM_CHANGEUISTATE"
   576  	case WM_UPDATEUISTATE:
   577  		return "WM_UPDATEUISTATE"
   578  	case WM_QUERYUISTATE:
   579  		return "WM_QUERYUISTATE"
   580  	case WM_UNINITMENUPOPUP:
   581  		return "WM_UNINITMENUPOPUP"
   582  	case WM_MENURBUTTONUP:
   583  		return "WM_MENURBUTTONUP"
   584  	case WM_MENUCOMMAND:
   585  		return "WM_MENUCOMMAND"
   586  	case WM_MENUGETOBJECT:
   587  		return "WM_MENUGETOBJECT"
   588  	case WM_MENUDRAG:
   589  		return "WM_MENUDRAG"
   590  	case WM_APPCOMMAND:
   591  		return "WM_APPCOMMAND"
   592  	case WM_MENUCHAR:
   593  		return "WM_MENUCHAR"
   594  	case WM_MENUSELECT:
   595  		return "WM_MENUSELECT"
   596  	case WM_MOVE:
   597  		return "WM_MOVE"
   598  	case WM_MOVING:
   599  		return "WM_MOVING"
   600  	case WM_NCACTIVATE:
   601  		return "WM_NCACTIVATE"
   602  	case WM_NCCALCSIZE:
   603  		return "WM_NCCALCSIZE"
   604  	case WM_NCCREATE:
   605  		return "WM_NCCREATE"
   606  	case WM_NCDESTROY:
   607  		return "WM_NCDESTROY"
   608  	case WM_NCHITTEST:
   609  		return "WM_NCHITTEST"
   610  	case WM_NCLBUTTONDBLCLK:
   611  		return "WM_NCLBUTTONDBLCLK"
   612  	case WM_NCLBUTTONDOWN:
   613  		return "WM_NCLBUTTONDOWN"
   614  	case WM_NCLBUTTONUP:
   615  		return "WM_NCLBUTTONUP"
   616  	case WM_NCMBUTTONDBLCLK:
   617  		return "WM_NCMBUTTONDBLCLK"
   618  	case WM_NCMBUTTONDOWN:
   619  		return "WM_NCMBUTTONDOWN"
   620  	case WM_NCMBUTTONUP:
   621  		return "WM_NCMBUTTONUP"
   622  	case WM_NCXBUTTONDOWN:
   623  		return "WM_NCXBUTTONDOWN"
   624  	case WM_NCXBUTTONUP:
   625  		return "WM_NCXBUTTONUP"
   626  	case WM_NCXBUTTONDBLCLK:
   627  		return "WM_NCXBUTTONDBLCLK"
   628  	case WM_NCMOUSEHOVER:
   629  		return "WM_NCMOUSEHOVER"
   630  	case WM_NCMOUSELEAVE:
   631  		return "WM_NCMOUSELEAVE"
   632  	case WM_NCMOUSEMOVE:
   633  		return "WM_NCMOUSEMOVE"
   634  	case WM_NCPAINT:
   635  		return "WM_NCPAINT"
   636  	case WM_NCRBUTTONDBLCLK:
   637  		return "WM_NCRBUTTONDBLCLK"
   638  	case WM_NCRBUTTONDOWN:
   639  		return "WM_NCRBUTTONDOWN"
   640  	case WM_NCRBUTTONUP:
   641  		return "WM_NCRBUTTONUP"
   642  	case WM_NEXTDLGCTL:
   643  		return "WM_NEXTDLGCTL"
   644  	case WM_NEXTMENU:
   645  		return "WM_NEXTMENU"
   646  	case WM_NOTIFY:
   647  		return "WM_NOTIFY"
   648  	case WM_NOTIFYFORMAT:
   649  		return "WM_NOTIFYFORMAT"
   650  	case WM_NULL:
   651  		return "WM_NULL"
   652  	case WM_PAINT:
   653  		return "WM_PAINT"
   654  	case WM_PAINTCLIPBOARD:
   655  		return "WM_PAINTCLIPBOARD"
   656  	case WM_PAINTICON:
   657  		return "WM_PAINTICON"
   658  	case WM_PALETTECHANGED:
   659  		return "WM_PALETTECHANGED"
   660  	case WM_PALETTEISCHANGING:
   661  		return "WM_PALETTEISCHANGING"
   662  	case WM_PARENTNOTIFY:
   663  		return "WM_PARENTNOTIFY"
   664  	case WM_PASTE:
   665  		return "WM_PASTE"
   666  	case WM_PENWINFIRST:
   667  		return "WM_PENWINFIRST"
   668  	case WM_PENWINLAST:
   669  		return "WM_PENWINLAST"
   670  	case WM_POWER:
   671  		return "WM_POWER"
   672  	case WM_PRINT:
   673  		return "WM_PRINT"
   674  	case WM_PRINTCLIENT:
   675  		return "WM_PRINTCLIENT"
   676  	case WM_QUERYDRAGICON:
   677  		return "WM_QUERYDRAGICON"
   678  	case WM_QUERYENDSESSION:
   679  		return "WM_QUERYENDSESSION"
   680  	case WM_QUERYNEWPALETTE:
   681  		return "WM_QUERYNEWPALETTE"
   682  	case WM_QUERYOPEN:
   683  		return "WM_QUERYOPEN"
   684  	case WM_QUEUESYNC:
   685  		return "WM_QUEUESYNC"
   686  	case WM_QUIT:
   687  		return "WM_QUIT"
   688  	case WM_RENDERALLFORMATS:
   689  		return "WM_RENDERALLFORMATS"
   690  	case WM_RENDERFORMAT:
   691  		return "WM_RENDERFORMAT"
   692  	case WM_SETCURSOR:
   693  		return "WM_SETCURSOR"
   694  	case WM_SETFOCUS:
   695  		return "WM_SETFOCUS"
   696  	case WM_SETFONT:
   697  		return "WM_SETFONT"
   698  	case WM_SETHOTKEY:
   699  		return "WM_SETHOTKEY"
   700  	case WM_SETICON:
   701  		return "WM_SETICON"
   702  	case WM_SETREDRAW:
   703  		return "WM_SETREDRAW"
   704  	case WM_SETTEXT:
   705  		return "WM_SETTEXT"
   706  	case WM_SETTINGCHANGE:
   707  		return "WM_SETTINGCHANGE"
   708  	case WM_SHOWWINDOW:
   709  		return "WM_SHOWWINDOW"
   710  	case WM_SIZE:
   711  		return "WM_SIZE"
   712  	case WM_SIZECLIPBOARD:
   713  		return "WM_SIZECLIPBOARD"
   714  	case WM_SIZING:
   715  		return "WM_SIZING"
   716  	case WM_SPOOLERSTATUS:
   717  		return "WM_SPOOLERSTATUS"
   718  	case WM_STYLECHANGED:
   719  		return "WM_STYLECHANGED"
   720  	case WM_STYLECHANGING:
   721  		return "WM_STYLECHANGING"
   722  	case WM_SYSCHAR:
   723  		return "WM_SYSCHAR"
   724  	case WM_SYSCOLORCHANGE:
   725  		return "WM_SYSCOLORCHANGE"
   726  	case WM_SYSCOMMAND:
   727  		return "WM_SYSCOMMAND"
   728  	case WM_SYSDEADCHAR:
   729  		return "WM_SYSDEADCHAR"
   730  	case WM_SYSKEYDOWN:
   731  		return "WM_SYSKEYDOWN"
   732  	case WM_SYSKEYUP:
   733  		return "WM_SYSKEYUP"
   734  	case WM_TCARD:
   735  		return "WM_TCARD"
   736  	case WM_THEMECHANGED:
   737  		return "WM_THEMECHANGED"
   738  	case WM_TIMECHANGE:
   739  		return "WM_TIMECHANGE"
   740  	case WM_TIMER:
   741  		return "WM_TIMER"
   742  	case WM_UNDO:
   743  		return "WM_UNDO"
   744  	case WM_USER:
   745  		return "WM_USER"
   746  	case WM_USERCHANGED:
   747  		return "WM_USERCHANGED"
   748  	case WM_VKEYTOITEM:
   749  		return "WM_VKEYTOITEM"
   750  	case WM_VSCROLL:
   751  		return "WM_VSCROLL"
   752  	case WM_VSCROLLCLIPBOARD:
   753  		return "WM_VSCROLLCLIPBOARD"
   754  	case WM_WINDOWPOSCHANGED:
   755  		return "WM_WINDOWPOSCHANGED"
   756  	case WM_WINDOWPOSCHANGING:
   757  		return "WM_WINDOWPOSCHANGING"
   758  	case WM_KEYLAST:
   759  		return "WM_KEYLAST"
   760  	case WM_SYNCPAINT:
   761  		return "WM_SYNCPAINT"
   762  	case WM_MOUSEACTIVATE:
   763  		return "WM_MOUSEACTIVATE"
   764  	case WM_MOUSEMOVE:
   765  		return "WM_MOUSEMOVE"
   766  	case WM_LBUTTONDOWN:
   767  		return "WM_LBUTTONDOWN"
   768  	case WM_LBUTTONUP:
   769  		return "WM_LBUTTONUP"
   770  	case WM_LBUTTONDBLCLK:
   771  		return "WM_LBUTTONDBLCLK"
   772  	case WM_RBUTTONDOWN:
   773  		return "WM_RBUTTONDOWN"
   774  	case WM_RBUTTONUP:
   775  		return "WM_RBUTTONUP"
   776  	case WM_RBUTTONDBLCLK:
   777  		return "WM_RBUTTONDBLCLK"
   778  	case WM_MBUTTONDOWN:
   779  		return "WM_MBUTTONDOWN"
   780  	case WM_MBUTTONUP:
   781  		return "WM_MBUTTONUP"
   782  	case WM_MBUTTONDBLCLK:
   783  		return "WM_MBUTTONDBLCLK"
   784  	case WM_MOUSEWHEEL:
   785  		return "WM_MOUSEWHEEL"
   786  	case WM_XBUTTONDOWN:
   787  		return "WM_XBUTTONDOWN"
   788  	case WM_XBUTTONUP:
   789  		return "WM_XBUTTONUP"
   790  	case WM_MOUSELAST:
   791  		return "WM_MOUSELAST"
   792  	case WM_MOUSEHOVER:
   793  		return "WM_MOUSEHOVER"
   794  	case WM_MOUSELEAVE:
   795  		return "WM_MOUSELEAVE"
   796  	case WM_CLIPBOARDUPDATE:
   797  		return "WM_CLIPBOARDUPDATE"
   798  	default:
   799  		return fmt.Sprintf("0x%08x", msg)
   800  	}
   801  }
   802  
   803  var windowsVersion, _ = operatingsystem.GetWindowsVersionInfo()
   804  
   805  func IsWindowsVersionAtLeast(major, minor, buildNumber int) bool {
   806  	return windowsVersion.Major >= major &&
   807  		windowsVersion.Minor >= minor &&
   808  		windowsVersion.Build >= buildNumber
   809  }
   810  
   811  type WindowProc func(hwnd HWND, msg uint32, wparam, lparam uintptr) uintptr
   812  
   813  func GetModuleHandle(value uintptr) uintptr {
   814  	result, _, _ := procGetModuleHandle.Call(value)
   815  	return result
   816  }
   817  
   818  func GetMessage(msg *MSG) uintptr {
   819  	rt, _, _ := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), 0, 0, 0)
   820  	return rt
   821  }
   822  
   823  func PostMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
   824  	ret, _, _ := procPostMessage.Call(
   825  		uintptr(hwnd),
   826  		uintptr(msg),
   827  		wParam,
   828  		lParam)
   829  
   830  	return ret
   831  }
   832  
   833  func ShellNotifyIcon(cmd uintptr, nid *NOTIFYICONDATA) bool {
   834  	ret, _, _ := procShellNotifyIcon.Call(cmd, uintptr(unsafe.Pointer(nid)))
   835  	return ret == 1
   836  }
   837  
   838  func IsDialogMessage(hwnd HWND, msg *MSG) uintptr {
   839  	ret, _, _ := procIsDialogMessage.Call(uintptr(hwnd), uintptr(unsafe.Pointer(msg)))
   840  	return ret
   841  }
   842  
   843  func TranslateMessage(msg *MSG) uintptr {
   844  	ret, _, _ := procTranslateMessage.Call(uintptr(unsafe.Pointer(msg)))
   845  	return ret
   846  }
   847  
   848  func DispatchMessage(msg *MSG) uintptr {
   849  	ret, _, _ := procDispatchMessage.Call(uintptr(unsafe.Pointer(msg)))
   850  	return ret
   851  }
   852  
   853  func PostQuitMessage(exitCode int32) {
   854  	procPostQuitMessage.Call(uintptr(exitCode))
   855  }
   856  
   857  func LoHiWords(input uint32) (uint16, uint16) {
   858  	return uint16(input & 0xffff), uint16(input >> 16 & 0xffff)
   859  }