diff --git a/v3/go.mod b/v3/go.mod index 4ffb85ce..84496cb5 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -4,6 +4,7 @@ go 1.19 require ( github.com/go-task/task/v3 v3.20.0 + github.com/gonutz/w32/v2 v2.7.0 github.com/google/go-cmp v0.5.9 github.com/jackmordaunt/icns/v2 v2.2.1 github.com/json-iterator/go v1.1.12 diff --git a/v3/go.sum b/v3/go.sum index ff474ab9..5cd5efb9 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -27,6 +27,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/task/v3 v3.20.0 h1:pTavuhP+AiEpKLzh5I6Lja9Ux7ypYO5QMsEPTbhYEDc= github.com/go-task/task/v3 v3.20.0/go.mod h1:y7rWakbLR5gFElGgo6rA2dyr6vU/zNIDVfn3S4Of6OI= +github.com/gonutz/w32/v2 v2.7.0 h1:O9lx/5tZ+WjZdxdvQFTh+/kP/7y95YCaL5MHqPrIHn4= +github.com/gonutz/w32/v2 v2.7.0/go.mod h1:MgtHx0AScDVNKyB+kjyPder4xIi3XAcHS6LDDU2DmdE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= diff --git a/v3/internal/w32/LICENSE b/v3/internal/w32/LICENSE new file mode 100644 index 00000000..2a1db3e9 --- /dev/null +++ b/v3/internal/w32/LICENSE @@ -0,0 +1,48 @@ +The MIT License (MIT) + +Copyright (c) 2021 gonutz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +This is the license from the original fork that this library is based on: + +Copyright (c) 2010-2012 The w32 Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/v3/internal/w32/README.md b/v3/internal/w32/README.md new file mode 100644 index 00000000..b67af00a --- /dev/null +++ b/v3/internal/w32/README.md @@ -0,0 +1,20 @@ + +This is a fork of [gonutz/w32](https://github.com/gonutz/w32). + +----------------------- + +About w32 +========== + +w32 is a wrapper for a number of Windows APIs for the [Go Programming Language](https://golang.org/). + +This library has no other dependencies and you need no C-compiler, it is written in pure Go. Some function signatures have been adapted to make them work in Go, e.g. functions that take a pointer to an array and a count of items in C will now simply accept a slice in Go. + +If you miss any Windows API functions, just write an issue or create a pull request, the Win32 API is very large and has many rarely used functions in it so this wrapper is supposed to grow as needed by the Go community. + +Installation +============ + +Get the latest version with: + + go get github.com/gonutz/w32/v2 diff --git a/v3/internal/w32/com.go b/v3/internal/w32/com.go new file mode 100644 index 00000000..8542af1b --- /dev/null +++ b/v3/internal/w32/com.go @@ -0,0 +1,251 @@ +package w32 + +import ( + "errors" + "syscall" + "unicode/utf16" + "unsafe" +) + +type pIUnknownVtbl struct { + queryInterface uintptr + addRef uintptr + release uintptr +} + +type IUnknown struct { + lpVtbl *pIUnknownVtbl +} + +func (u *IUnknown) QueryInterface(id *GUID) (*IDispatch, HRESULT) { + return ComQueryInterface(u, id) +} + +func (u *IUnknown) AddRef() int32 { + return ComAddRef(u) +} + +func (u *IUnknown) Release() int32 { + return ComRelease(u) +} + +type pIDispatchVtbl struct { + queryInterface uintptr + addRef uintptr + release uintptr + getTypeInfoCount uintptr + getTypeInfo uintptr + getIDsOfNames uintptr + invoke uintptr +} + +type IDispatch struct { + lpVtbl *pIDispatchVtbl +} + +func (d *IDispatch) QueryInterface(id *GUID) (*IDispatch, HRESULT) { + return ComQueryInterface((*IUnknown)(unsafe.Pointer(d)), id) +} + +func (d *IDispatch) AddRef() int32 { + return ComAddRef((*IUnknown)(unsafe.Pointer(d))) +} + +func (d *IDispatch) Release() int32 { + return ComRelease((*IUnknown)(unsafe.Pointer(d))) +} + +func (d *IDispatch) GetIDsOfName(names []string) ([]int32, HRESULT) { + return ComGetIDsOfName(d, names) +} + +func (d *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) { + return ComInvoke(d, dispid, dispatch, params...) +} + +type pIStreamVtbl struct { + qeryInterface uintptr + addRef uintptr + release uintptr +} + +type IStream struct { + lpVtbl *pIStreamVtbl +} + +func (s *IStream) QueryInterface(id *GUID) (*IDispatch, HRESULT) { + return ComQueryInterface((*IUnknown)(unsafe.Pointer(s)), id) +} + +func (s *IStream) AddRef() int32 { + return ComAddRef((*IUnknown)(unsafe.Pointer(s))) +} + +func (s *IStream) Release() int32 { + return ComRelease((*IUnknown)(unsafe.Pointer(s))) +} + +func ComAddRef(unknown *IUnknown) int32 { + ret, _, _ := syscall.Syscall(unknown.lpVtbl.addRef, 1, + uintptr(unsafe.Pointer(unknown)), + 0, + 0) + return int32(ret) +} + +func ComRelease(unknown *IUnknown) int32 { + ret, _, _ := syscall.Syscall(unknown.lpVtbl.release, 1, + uintptr(unsafe.Pointer(unknown)), + 0, + 0) + return int32(ret) +} + +func ComQueryInterface(unknown *IUnknown, id *GUID) (*IDispatch, HRESULT) { + var disp *IDispatch + hr, _, _ := syscall.Syscall(unknown.lpVtbl.queryInterface, 3, + uintptr(unsafe.Pointer(unknown)), + uintptr(unsafe.Pointer(id)), + uintptr(unsafe.Pointer(&disp)), + ) + return disp, HRESULT(hr) +} + +func ComGetIDsOfName(disp *IDispatch, names []string) ([]int32, HRESULT) { + wnames := make([]*uint16, len(names)) + dispid := make([]int32, len(names)) + for i := 0; i < len(names); i++ { + wnames[i] = syscall.StringToUTF16Ptr(names[i]) + } + hr, _, _ := syscall.Syscall6(disp.lpVtbl.getIDsOfNames, 6, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(unsafe.Pointer(&wnames[0])), + uintptr(len(names)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&dispid[0])), + ) + return dispid, HRESULT(hr) +} + +func ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { + var dispparams DISPPARAMS + + if dispatch&DISPATCH_PROPERTYPUT != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.CNamedArgs = 1 + } + var vargs []VARIANT + if len(params) > 0 { + vargs = make([]VARIANT, len(params)) + for i, v := range params { + n := len(params) - i - 1 + VariantInit(&vargs[n]) + switch v.(type) { + case bool: + if v.(bool) { + vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0xffff} + } else { + vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0} + } + case *bool: + vargs[n] = VARIANT{VT_BOOL | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*bool))))} + case byte: + vargs[n] = VARIANT{VT_I1, 0, 0, 0, int64(v.(byte))} + case *byte: + vargs[n] = VARIANT{VT_I1 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*byte))))} + case int16: + vargs[n] = VARIANT{VT_I2, 0, 0, 0, int64(v.(int16))} + case *int16: + vargs[n] = VARIANT{VT_I2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int16))))} + case uint16: + vargs[n] = VARIANT{VT_UI2, 0, 0, 0, int64(v.(int16))} + case *uint16: + vargs[n] = VARIANT{VT_UI2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint16))))} + case int, int32: + vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(int))} + case *int, *int32: + vargs[n] = VARIANT{VT_I4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int))))} + case uint, uint32: + vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(uint))} + case *uint, *uint32: + vargs[n] = VARIANT{VT_UI4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint))))} + case int64: + vargs[n] = VARIANT{VT_I8, 0, 0, 0, v.(int64)} + case *int64: + vargs[n] = VARIANT{VT_I8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int64))))} + case uint64: + vargs[n] = VARIANT{VT_UI8, 0, 0, 0, int64(v.(uint64))} + case *uint64: + vargs[n] = VARIANT{VT_UI8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint64))))} + case float32: + vargs[n] = VARIANT{VT_R4, 0, 0, 0, int64(v.(float32))} + case *float32: + vargs[n] = VARIANT{VT_R4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float32))))} + case float64: + vargs[n] = VARIANT{VT_R8, 0, 0, 0, int64(v.(float64))} + case *float64: + vargs[n] = VARIANT{VT_R8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float64))))} + case string: + vargs[n] = VARIANT{VT_BSTR, 0, 0, 0, int64(uintptr(unsafe.Pointer(SysAllocString(v.(string)))))} + case *string: + vargs[n] = VARIANT{VT_BSTR | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*string))))} + case *IDispatch: + vargs[n] = VARIANT{VT_DISPATCH, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))} + case **IDispatch: + vargs[n] = VARIANT{VT_DISPATCH | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))} + case nil: + vargs[n] = VARIANT{VT_NULL, 0, 0, 0, 0} + case *VARIANT: + vargs[n] = VARIANT{VT_VARIANT | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))} + default: + return nil, errors.New("w32.ComInvoke: unknown variant type") + } + } + dispparams.Rgvarg = uintptr(unsafe.Pointer(&vargs[0])) + dispparams.CArgs = uint32(len(params)) + } + + var ret VARIANT + var excepInfo EXCEPINFO + VariantInit(&ret) + hr, _, _ := syscall.Syscall9(disp.lpVtbl.invoke, 8, + uintptr(unsafe.Pointer(disp)), + uintptr(dispid), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(GetUserDefaultLCID()), + uintptr(dispatch), + uintptr(unsafe.Pointer(&dispparams)), + uintptr(unsafe.Pointer(&ret)), + uintptr(unsafe.Pointer(&excepInfo)), + 0) + if hr != 0 { + if excepInfo.BstrDescription != nil { + bs := UTF16PtrToString(excepInfo.BstrDescription) + return nil, errors.New(bs) + } + } + for _, varg := range vargs { + if varg.VT == VT_BSTR && varg.Val != 0 { + SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val))))) + } + } + result = &ret + return +} + +func UTF16PtrToString(cstr *uint16) string { + if cstr != nil { + us := make([]uint16, 0, 256) + for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 { + u := *(*uint16)(unsafe.Pointer(p)) + if u == 0 { + return string(utf16.Decode(us)) + } + us = append(us, u) + } + } + + return "" +} diff --git a/v3/internal/w32/constants.go b/v3/internal/w32/constants.go new file mode 100644 index 00000000..3c4ba53c --- /dev/null +++ b/v3/internal/w32/constants.go @@ -0,0 +1,4875 @@ +package w32 + +// TODO Check that these messages are correct: +// WM_* +// TTM_* +// TBM_* + +const ( + FALSE = 0 + TRUE = 1 +) + +const ( + NO_ERROR = 0 + ERROR_SUCCESS = 0 + ERROR_FILE_NOT_FOUND = 2 + ERROR_PATH_NOT_FOUND = 3 + ERROR_ACCESS_DENIED = 5 + ERROR_INVALID_HANDLE = 6 + ERROR_BAD_FORMAT = 11 + ERROR_INVALID_NAME = 123 + ERROR_ALREADY_EXISTS = 183 + ERROR_MORE_DATA = 234 + ERROR_NO_MORE_ITEMS = 259 + ERROR_INVALID_SERVICE_CONTROL = 1052 + ERROR_SERVICE_REQUEST_TIMEOUT = 1053 + ERROR_SERVICE_NO_THREAD = 1054 + ERROR_SERVICE_DATABASE_LOCKED = 1055 + ERROR_SERVICE_ALREADY_RUNNING = 1056 + ERROR_SERVICE_DISABLED = 1058 + ERROR_SERVICE_DOES_NOT_EXIST = 1060 + ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061 + ERROR_SERVICE_NOT_ACTIVE = 1062 + ERROR_DATABASE_DOES_NOT_EXIST = 1065 + ERROR_SERVICE_DEPENDENCY_FAIL = 1068 + ERROR_SERVICE_LOGON_FAILED = 1069 + ERROR_SERVICE_MARKED_FOR_DELETE = 1072 + ERROR_SERVICE_DEPENDENCY_DELETED = 1075 +) + +const ( + SE_ERR_FNF = 2 + SE_ERR_PNF = 3 + SE_ERR_ACCESSDENIED = 5 + SE_ERR_OOM = 8 + SE_ERR_DLLNOTFOUND = 32 + SE_ERR_SHARE = 26 + SE_ERR_ASSOCINCOMPLETE = 27 + SE_ERR_DDETIMEOUT = 28 + SE_ERR_DDEFAIL = 29 + SE_ERR_DDEBUSY = 30 + SE_ERR_NOASSOC = 31 +) + +const ( + CW_USEDEFAULT = ^0x7FFFFFFF +) + +// ShowWindow constants +const ( + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_MAXIMIZE = 3 + SW_SHOWMAXIMIZED = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +// Window class styles +const ( + CS_VREDRAW = 0x00000001 + CS_HREDRAW = 0x00000002 + CS_KEYCVTWINDOW = 0x00000004 + CS_DBLCLKS = 0x00000008 + CS_OWNDC = 0x00000020 + CS_CLASSDC = 0x00000040 + CS_PARENTDC = 0x00000080 + CS_NOKEYCVT = 0x00000100 + CS_NOCLOSE = 0x00000200 + CS_SAVEBITS = 0x00000800 + CS_BYTEALIGNCLIENT = 0x00001000 + CS_BYTEALIGNWINDOW = 0x00002000 + CS_GLOBALCLASS = 0x00004000 + CS_IME = 0x00010000 + CS_DROPSHADOW = 0x00020000 +) + +// Predefined cursor constants +const ( + IDC_ARROW = 32512 + IDC_IBEAM = 32513 + IDC_WAIT = 32514 + IDC_CROSS = 32515 + IDC_UPARROW = 32516 + IDC_SIZENWSE = 32642 + IDC_SIZENESW = 32643 + IDC_SIZEWE = 32644 + IDC_SIZENS = 32645 + IDC_SIZEALL = 32646 + IDC_NO = 32648 + IDC_HAND = 32649 + IDC_APPSTARTING = 32650 + IDC_HELP = 32651 + IDC_ICON = 32641 + IDC_SIZE = 32640 +) + +// Predefined icon constants +const ( + IDI_APPLICATION = 32512 + IDI_HAND = 32513 + IDI_QUESTION = 32514 + IDI_EXCLAMATION = 32515 + IDI_ASTERISK = 32516 + IDI_WINLOGO = 32517 + IDI_SHIELD = 32518 + IDI_WARNING = IDI_EXCLAMATION + IDI_ERROR = IDI_HAND + IDI_INFORMATION = IDI_ASTERISK +) + +// Button style constants +const ( + BS_3STATE = 5 + BS_AUTO3STATE = 6 + BS_AUTOCHECKBOX = 3 + BS_AUTORADIOBUTTON = 9 + BS_BITMAP = 128 + BS_BOTTOM = 0x800 + BS_CENTER = 0x300 + BS_CHECKBOX = 2 + BS_DEFPUSHBUTTON = 1 + BS_GROUPBOX = 7 + BS_ICON = 64 + BS_LEFT = 256 + BS_LEFTTEXT = 32 + BS_MULTILINE = 0x2000 + BS_NOTIFY = 0x4000 + BS_OWNERDRAW = 0xB + BS_PUSHBUTTON = 0 + BS_PUSHLIKE = 4096 + BS_RADIOBUTTON = 4 + BS_RIGHT = 512 + BS_RIGHTBUTTON = 32 + BS_TEXT = 0 + BS_TOP = 0x400 + BS_USERBUTTON = 8 + BS_VCENTER = 0xC00 + BS_FLAT = 0x8000 +) + +// Button state constants +const ( + BST_CHECKED = 1 + BST_INDETERMINATE = 2 + BST_UNCHECKED = 0 + BST_FOCUS = 8 + BST_PUSHED = 4 +) + +// Combo box style constants +const ( + CBS_SIMPLE = 0x0001 + CBS_DROPDOWN = 0x0002 + CBS_DROPDOWNLIST = 0x0003 + CBS_OWNERDRAWFIXED = 0x0010 + CBS_OWNERDRAWVARIABLE = 0x0020 + CBS_AUTOHSCROLL = 0x0040 + CBS_OEMCONVERT = 0x0080 + CBS_SORT = 0x0100 + CBS_HASSTRINGS = 0x0200 + CBS_NOINTEGRALHEIGHT = 0x0400 + CBS_DISABLENOSCROLL = 0x0800 + CBS_UPPERCASE = 0x2000 + CBS_LOWERCASE = 0x4000 +) + +// Combo box message constants +const ( + CB_GETEDITSEL = 0x0140 + CB_LIMITTEXT = 0x0141 + CB_SETEDITSEL = 0x0142 + CB_ADDSTRING = 0x0143 + CB_DELETESTRING = 0x0144 + CB_DIR = 0x0145 + CB_GETCOUNT = 0x0146 + CB_GETCURSEL = 0x0147 + CB_GETLBTEXT = 0x0148 + CB_GETLBTEXTLEN = 0x0149 + CB_INSERTSTRING = 0x014A + CB_RESETCONTENT = 0x014B + CB_FINDSTRING = 0x014C + CB_SELECTSTRING = 0x014D + CB_SETCURSEL = 0x014E + CB_SHOWDROPDOWN = 0x014F + CB_GETITEMDATA = 0x0150 + CB_SETITEMDATA = 0x0151 + CB_GETDROPPEDCONTROLRECT = 0x0152 + CB_SETITEMHEIGHT = 0x0153 + CB_GETITEMHEIGHT = 0x0154 + CB_SETEXTENDEDUI = 0x0155 + CB_GETEXTENDEDUI = 0x0156 + CB_GETDROPPEDSTATE = 0x0157 + CB_FINDSTRINGEXACT = 0x0158 + CB_SETLOCALE = 0x0159 + CB_GETLOCALE = 0x015A + CB_GETTOPINDEX = 0x015B + CB_SETTOPINDEX = 0x015C + CB_GETHORIZONTALEXTENT = 0x015D + CB_SETHORIZONTALEXTENT = 0x015E + CB_GETDROPPEDWIDTH = 0x015F + CB_SETDROPPEDWIDTH = 0x0160 + CB_INITSTORAGE = 0x0161 + CB_MULTIPLEADDSTRING = 0x0163 + CB_GETCOMBOBOXINFO = 0x0164 + CB_MSGMAX = 0x0165 +) + +// Combo box return values +const ( + CB_OKAY = 0 + CB_ERR = -1 + CB_ERRSPACE = -2 +) + +// Combo box notification codes +const ( + CBN_ERRSPACE = -1 + CBN_SELCHANGE = 1 + CBN_DBLCLK = 2 + CBN_SETFOCUS = 3 + CBN_KILLFOCUS = 4 + CBN_EDITCHANGE = 5 + CBN_EDITUPDATE = 6 + CBN_DROPDOWN = 7 + CBN_CLOSEUP = 8 + CBN_SELENDOK = 9 + CBN_SELENDCANCEL = 10 +) + +// List box message constants +const ( + LB_ADDSTRING = 384 + LB_INSERTSTRING = 385 + LB_DELETESTRING = 386 + LB_SELITEMRANGEEX = 387 + LB_RESETCONTENT = 388 + LB_SETSEL = 389 + LB_SETCURSEL = 390 + LB_GETSEL = 391 + LB_GETCURSEL = 392 + LB_GETTEXT = 393 + LB_GETTEXTLEN = 394 + LB_GETCOUNT = 395 + LB_SELECTSTRING = 396 + LB_DIR = 397 + LB_GETTOPINDEX = 398 + LB_FINDSTRING = 399 + LB_GETSELCOUNT = 400 + LB_GETSELITEMS = 401 + LB_SETTABSTOPS = 402 + LB_GETHORIZONTALEXTENT = 403 + LB_SETHORIZONTALEXTENT = 404 + LB_SETCOLUMNWIDTH = 405 + LB_ADDFILE = 406 + LB_SETTOPINDEX = 407 + LB_GETITEMRECT = 408 + LB_GETITEMDATA = 409 + LB_SETITEMDATA = 410 + LB_SELITEMRANGE = 411 + LB_SETANCHORINDEX = 412 + LB_GETANCHORINDEX = 413 + LB_SETCARETINDEX = 414 + LB_GETCARETINDEX = 415 + LB_SETITEMHEIGHT = 416 + LB_GETITEMHEIGHT = 417 + LB_FINDSTRINGEXACT = 418 + LB_SETLOCALE = 421 + LB_GETLOCALE = 422 + LB_SETCOUNT = 423 + LB_INITSTORAGE = 424 + LB_ITEMFROMPOINT = 425 + LB_SETTEXT = 426 + LB_GETCHECKMARK = 427 + LB_SETCHECKMARK = 428 + LB_GETITEMADDDATA = 429 + LB_SETITEMADDDATA = 430 +) + +// List box styles +const ( + LBS_NOTIFY = 0x0001 + LBS_SORT = 0x0002 + LBS_NOREDRAW = 0x0004 + LBS_MULTIPLESEL = 0x0008 + LBS_OWNERDRAWFIXED = 0x0010 + LBS_OWNERDRAWVARIABLE = 0x0020 + LBS_HASSTRINGS = 0x0040 + LBS_USETABSTOPS = 0x0080 + LBS_NOINTEGRALHEIGHT = 0x0100 + LBS_MULTICOLUMN = 0x0200 + LBS_WANTKEYBOARDINPUT = 0x0400 + LBS_EXTENDEDSEL = 0x0800 + LBS_STANDARD = LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER + LBS_CHECKBOX = 0x1000 + LBS_USEICON = 0x2000 + LBS_AUTOCHECK = 0x4000 + LBS_AUTOCHECKBOX = 0x5000 + LBS_PRELOADED = 0x4000 + LBS_COMBOLBOX = 0x8000 +) + +// List box notification messages +const ( + LBN_ERRSPACE = -2 + LBN_SELCHANGE = 1 + LBN_DBLCLK = 2 + LBN_SELCANCEL = 3 + LBN_SETFOCUS = 4 + LBN_KILLFOCUS = 5 + LBN_CLICKCHECKMARK = 6 +) + +// List box return values +const ( + LB_OKAY = 0 + LB_ERR = -1 + LB_ERRSPACE = -2 +) + +// Predefined color/brush constants. +const ( + // Scroll bar gray area. + COLOR_SCROLLBAR = 0 + + // Desktop. + COLOR_BACKGROUND = 1 + + // Desktop. + COLOR_DESKTOP = 1 + + // Active window title bar. The associated foreground color is + // COLOR_CAPTIONTEXT. Specifies the left side color in the color gradient of + // an active window's title bar if the gradient effect is enabled. + COLOR_ACTIVECAPTION = 2 + + // Inactive window caption. + // The associated foreground color is COLOR_INACTIVECAPTIONTEXT. + // Specifies the left side color in the color gradient of an inactive window's title bar if the gradient effect is enabled. + COLOR_INACTIVECAPTION = 3 + + // Menu background. The associated foreground color is COLOR_MENUTEXT. + COLOR_MENU = 4 + + // Window background. The associated foreground colors are COLOR_WINDOWTEXT + // and COLOR_HOTLITE. + COLOR_WINDOW = 5 + + // Window frame. + COLOR_WINDOWFRAME = 6 + + // Text in menus. The associated background color is COLOR_MENU. + COLOR_MENUTEXT = 7 + + // Text in windows. The associated background color is COLOR_WINDOW. + COLOR_WINDOWTEXT = 8 + + // Text in caption, size box, and scroll bar arrow box. The associated + // background color is COLOR_ACTIVECAPTION. + COLOR_CAPTIONTEXT = 9 + + // Active window border. + COLOR_ACTIVEBORDER = 10 + + // Inactive window border. + COLOR_INACTIVEBORDER = 11 + + // Background color of multiple document interface (MDI) applications. + COLOR_APPWORKSPACE = 12 + + // Item(s) selected in a control. The associated foreground color is + // COLOR_HIGHLIGHTTEXT. + COLOR_HIGHLIGHT = 13 + + // Text of item(s) selected in a control. The associated background color is + // COLOR_HIGHLIGHT. + COLOR_HIGHLIGHTTEXT = 14 + + // Face color for three-dimensional display elements and for dialog box + // backgrounds. + COLOR_3DFACE = 15 + + // Face color for three-dimensional display elements and for dialog box + // backgrounds. The associated foreground color is COLOR_BTNTEXT. + COLOR_BTNFACE = 15 + + // Shadow color for three-dimensional display elements (for edges facing + // away from the light source). + COLOR_3DSHADOW = 16 + + // Shadow color for three-dimensional display elements (for edges facing + // away from the light source). + COLOR_BTNSHADOW = 16 + + // Grayed (disabled) text. This color is set to 0 if the current display + // driver does not support a solid gray color. + COLOR_GRAYTEXT = 17 + + // Text on push buttons. The associated background color is COLOR_BTNFACE. + COLOR_BTNTEXT = 18 + + // Color of text in an inactive caption. The associated background color is + // COLOR_INACTIVECAPTION. + COLOR_INACTIVECAPTIONTEXT = 19 + + // Highlight color for three-dimensional display elements (for edges facing + // the light source.) + COLOR_3DHIGHLIGHT = 20 + + // Highlight color for three-dimensional display elements (for edges facing + // the light source.) + COLOR_3DHILIGHT = 20 + + // Highlight color for three-dimensional display elements (for edges facing + // the light source.) + COLOR_BTNHIGHLIGHT = 20 + + // Highlight color for three-dimensional display elements (for edges facing + // the light source.) + COLOR_BTNHILIGHT = 20 + + // Dark shadow for three-dimensional display elements. + COLOR_3DDKSHADOW = 21 + + // Light color for three-dimensional display elements (for edges facing the + // light source.) + COLOR_3DLIGHT = 22 + + // Text color for tooltip controls. The associated background color is + // COLOR_INFOBK. + COLOR_INFOTEXT = 23 + + // Background color for tooltip controls. The associated foreground color is + // COLOR_INFOTEXT. + COLOR_INFOBK = 24 + + // Color for a hyperlink or hot-tracked item. The associated background + // color is COLOR_WINDOW. + COLOR_HOTLIGHT = 26 + + // Right side color in the color gradient of an active window's title bar. + // COLOR_ACTIVECAPTION specifies the left side color. Use + // SPI_GETGRADIENTCAPTIONS with the SystemParametersInfo function to + // determine whether the gradient effect is enabled. + COLOR_GRADIENTACTIVECAPTION = 27 + + // Right side color in the color gradient of an inactive window's title bar. + // COLOR_INACTIVECAPTION specifies the left side color. + COLOR_GRADIENTINACTIVECAPTION = 28 + + // The color used to highlight menu items when the menu appears as a flat + // menu (see SystemParametersInfo). The highlighted menu item is outlined + // with COLOR_HIGHLIGHT. Windows 2000: This value is not supported. + COLOR_MENUHILIGHT = 29 + + // The background color for the menu bar when menus appear as flat menus + // (see SystemParametersInfo). However, COLOR_MENU continues to specify the + // background color of the menu popup. Windows 2000: This value is not + // supported. + COLOR_MENUBAR = 30 +) + +// Button message constants +const ( + BM_CLICK = 245 + BM_GETCHECK = 240 + BM_GETIMAGE = 246 + BM_GETSTATE = 242 + BM_SETCHECK = 241 + BM_SETIMAGE = 247 + BM_SETSTATE = 243 + BM_SETSTYLE = 244 +) + +// Button notifications +const ( + BN_CLICKED = 0 + BN_PAINT = 1 + BN_HILITE = 2 + BN_PUSHED = BN_HILITE + BN_UNHILITE = 3 + BN_UNPUSHED = BN_UNHILITE + BN_DISABLE = 4 + BN_DOUBLECLICKED = 5 + BN_DBLCLK = BN_DOUBLECLICKED + BN_SETFOCUS = 6 + BN_KILLFOCUS = 7 +) + +// GetWindowLong and GetWindowLongPtr constants +const ( + GWL_EXSTYLE = -20 + GWL_STYLE = -16 + GWL_WNDPROC = -4 + GWLP_WNDPROC = -4 + GWL_HINSTANCE = -6 + GWLP_HINSTANCE = -6 + GWL_HWNDPARENT = -8 + GWLP_HWNDPARENT = -8 + GWL_ID = -12 + GWLP_ID = -12 + GWL_USERDATA = -21 + GWLP_USERDATA = -21 +) + +// Window style constants +const ( + WS_OVERLAPPED = 0x00000000 + WS_POPUP = 0x80000000 + WS_CHILD = 0x40000000 + WS_MINIMIZE = 0x20000000 + WS_VISIBLE = 0x10000000 + WS_DISABLED = 0x08000000 + WS_CLIPSIBLINGS = 0x04000000 + WS_CLIPCHILDREN = 0x02000000 + WS_MAXIMIZE = 0x01000000 + WS_CAPTION = 0x00C00000 + WS_BORDER = 0x00800000 + WS_DLGFRAME = 0x00400000 + WS_VSCROLL = 0x00200000 + WS_HSCROLL = 0x00100000 + WS_SYSMENU = 0x00080000 + WS_THICKFRAME = 0x00040000 + WS_GROUP = 0x00020000 + WS_TABSTOP = 0x00010000 + WS_MINIMIZEBOX = 0x00020000 + WS_MAXIMIZEBOX = 0x00010000 + WS_TILED = 0x00000000 + WS_ICONIC = 0x20000000 + WS_SIZEBOX = 0x00040000 + WS_OVERLAPPEDWINDOW = 0x00000000 | 0x00C00000 | 0x00080000 | 0x00040000 | 0x00020000 | 0x00010000 + WS_POPUPWINDOW = 0x80000000 | 0x00800000 | 0x00080000 + WS_CHILDWINDOW = 0x40000000 +) + +// Extended window style constants +const ( + WS_EX_DLGMODALFRAME = 0x00000001 + WS_EX_NOPARENTNOTIFY = 0x00000004 + WS_EX_TOPMOST = 0x00000008 + WS_EX_ACCEPTFILES = 0x00000010 + WS_EX_TRANSPARENT = 0x00000020 + WS_EX_MDICHILD = 0x00000040 + WS_EX_TOOLWINDOW = 0x00000080 + WS_EX_WINDOWEDGE = 0x00000100 + WS_EX_CLIENTEDGE = 0x00000200 + WS_EX_CONTEXTHELP = 0x00000400 + WS_EX_RIGHT = 0x00001000 + WS_EX_LEFT = 0x00000000 + WS_EX_RTLREADING = 0x00002000 + WS_EX_LTRREADING = 0x00000000 + WS_EX_LEFTSCROLLBAR = 0x00004000 + WS_EX_RIGHTSCROLLBAR = 0x00000000 + WS_EX_CONTROLPARENT = 0x00010000 + WS_EX_STATICEDGE = 0x00020000 + WS_EX_APPWINDOW = 0x00040000 + WS_EX_OVERLAPPEDWINDOW = 0x00000100 | 0x00000200 + WS_EX_PALETTEWINDOW = 0x00000100 | 0x00000080 | 0x00000008 + WS_EX_LAYERED = 0x00080000 + WS_EX_NOINHERITLAYOUT = 0x00100000 + WS_EX_LAYOUTRTL = 0x00400000 + WS_EX_COMPOSITED = 0x02000000 + WS_EX_NOACTIVATE = 0x08000000 +) + +// Window message constants +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_POWERBROADCAST = 536 + 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 = 265 + 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_MOUSEHWHEEL = 526 + WM_MOUSEFIRST = 512 + WM_XBUTTONDOWN = 523 + WM_XBUTTONUP = 524 + WM_XBUTTONDBLCLK = 525 + WM_MOUSELAST = 526 + WM_MOUSEHOVER = 0x2A1 + WM_MOUSELEAVE = 0x2A3 + WM_CLIPBOARDUPDATE = 0x031D +) + +// WM_ACTIVATE +const ( + WA_INACTIVE = 0 + WA_ACTIVE = 1 + WA_CLICKACTIVE = 2 +) + +const ( + LF_FACESIZE = 32 + LF_FULLFACESIZE = 64 +) + +const ( + MM_MAX_NUMAXES = 16 + MM_MAX_AXES_NAMELEN = 16 +) + +// Font weight constants +const ( + FW_DONTCARE = 0 + FW_THIN = 100 + FW_EXTRALIGHT = 200 + FW_ULTRALIGHT = FW_EXTRALIGHT + FW_LIGHT = 300 + FW_NORMAL = 400 + FW_REGULAR = 400 + FW_MEDIUM = 500 + FW_SEMIBOLD = 600 + FW_DEMIBOLD = FW_SEMIBOLD + FW_BOLD = 700 + FW_EXTRABOLD = 800 + FW_ULTRABOLD = FW_EXTRABOLD + FW_HEAVY = 900 + FW_BLACK = FW_HEAVY +) + +// Charset constants +const ( + ANSI_CHARSET = 0 + DEFAULT_CHARSET = 1 + SYMBOL_CHARSET = 2 + SHIFTJIS_CHARSET = 128 + HANGEUL_CHARSET = 129 + HANGUL_CHARSET = 129 + GB2312_CHARSET = 134 + CHINESEBIG5_CHARSET = 136 + GREEK_CHARSET = 161 + TURKISH_CHARSET = 162 + HEBREW_CHARSET = 177 + ARABIC_CHARSET = 178 + BALTIC_CHARSET = 186 + RUSSIAN_CHARSET = 204 + THAI_CHARSET = 222 + EASTEUROPE_CHARSET = 238 + OEM_CHARSET = 255 + JOHAB_CHARSET = 130 + VIETNAMESE_CHARSET = 163 + MAC_CHARSET = 77 +) + +// Font output precision constants +const ( + OUT_DEFAULT_PRECIS = 0 + OUT_STRING_PRECIS = 1 + OUT_CHARACTER_PRECIS = 2 + OUT_STROKE_PRECIS = 3 + OUT_TT_PRECIS = 4 + OUT_DEVICE_PRECIS = 5 + OUT_RASTER_PRECIS = 6 + OUT_TT_ONLY_PRECIS = 7 + OUT_OUTLINE_PRECIS = 8 + OUT_PS_ONLY_PRECIS = 10 +) + +// Font clipping precision constants +const ( + CLIP_DEFAULT_PRECIS = 0 + CLIP_CHARACTER_PRECIS = 1 + CLIP_STROKE_PRECIS = 2 + CLIP_MASK = 15 + CLIP_LH_ANGLES = 16 + CLIP_TT_ALWAYS = 32 + CLIP_EMBEDDED = 128 +) + +// Font output quality constants +const ( + DEFAULT_QUALITY = 0 + DRAFT_QUALITY = 1 + PROOF_QUALITY = 2 + NONANTIALIASED_QUALITY = 3 + ANTIALIASED_QUALITY = 4 + CLEARTYPE_QUALITY = 5 +) + +// Font pitch constants +const ( + DEFAULT_PITCH = 0 + FIXED_PITCH = 1 + VARIABLE_PITCH = 2 +) + +// Font family constants +const ( + FF_DECORATIVE = 80 + FF_DONTCARE = 0 + FF_MODERN = 48 + FF_ROMAN = 16 + FF_SCRIPT = 64 + FF_SWISS = 32 +) + +// DeviceCapabilities capabilities +const ( + DC_FIELDS = 1 + DC_PAPERS = 2 + DC_PAPERSIZE = 3 + DC_MINEXTENT = 4 + DC_MAXEXTENT = 5 + DC_BINS = 6 + DC_DUPLEX = 7 + DC_SIZE = 8 + DC_EXTRA = 9 + DC_VERSION = 10 + DC_DRIVER = 11 + DC_BINNAMES = 12 + DC_ENUMRESOLUTIONS = 13 + DC_FILEDEPENDENCIES = 14 + DC_TRUETYPE = 15 + DC_PAPERNAMES = 16 + DC_ORIENTATION = 17 + DC_COPIES = 18 + DC_BINADJUST = 19 + DC_EMF_COMPLIANT = 20 + DC_DATATYPE_PRODUCED = 21 + DC_COLLATE = 22 + DC_MANUFACTURER = 23 + DC_MODEL = 24 + DC_PERSONALITY = 25 + DC_PRINTRATE = 26 + DC_PRINTRATEUNIT = 27 + DC_PRINTERMEM = 28 + DC_MEDIAREADY = 29 + DC_STAPLE = 30 + DC_PRINTRATEPPM = 31 + DC_COLORDEVICE = 32 + DC_NUP = 33 + DC_MEDIATYPENAMES = 34 + DC_MEDIATYPES = 35 +) + +// GetDeviceCaps index constants +const ( + DRIVERVERSION = 0 + TECHNOLOGY = 2 + HORZSIZE = 4 + VERTSIZE = 6 + HORZRES = 8 + VERTRES = 10 + LOGPIXELSX = 88 + LOGPIXELSY = 90 + BITSPIXEL = 12 + PLANES = 14 + NUMBRUSHES = 16 + NUMPENS = 18 + NUMFONTS = 22 + NUMCOLORS = 24 + NUMMARKERS = 20 + ASPECTX = 40 + ASPECTY = 42 + ASPECTXY = 44 + PDEVICESIZE = 26 + CLIPCAPS = 36 + SIZEPALETTE = 104 + NUMRESERVED = 106 + COLORRES = 108 + PHYSICALWIDTH = 110 + PHYSICALHEIGHT = 111 + PHYSICALOFFSETX = 112 + PHYSICALOFFSETY = 113 + SCALINGFACTORX = 114 + SCALINGFACTORY = 115 + VREFRESH = 116 + DESKTOPHORZRES = 118 + DESKTOPVERTRES = 117 + BLTALIGNMENT = 119 + SHADEBLENDCAPS = 120 + COLORMGMTCAPS = 121 + RASTERCAPS = 38 + CURVECAPS = 28 + LINECAPS = 30 + POLYGONALCAPS = 32 + TEXTCAPS = 34 +) + +// GetDeviceCaps TECHNOLOGY constants +const ( + DT_PLOTTER = 0 + DT_RASDISPLAY = 1 + DT_RASPRINTER = 2 + DT_RASCAMERA = 3 + DT_CHARSTREAM = 4 + DT_METAFILE = 5 + DT_DISPFILE = 6 +) + +// GetDeviceCaps SHADEBLENDCAPS constants +const ( + SB_NONE = 0x00 + SB_CONST_ALPHA = 0x01 + SB_PIXEL_ALPHA = 0x02 + SB_PREMULT_ALPHA = 0x04 + SB_GRAD_RECT = 0x10 + SB_GRAD_TRI = 0x20 +) + +// GetDeviceCaps COLORMGMTCAPS constants +const ( + CM_NONE = 0x00 + CM_DEVICE_ICM = 0x01 + CM_GAMMA_RAMP = 0x02 + CM_CMYK_COLOR = 0x04 +) + +// GetDeviceCaps RASTERCAPS constants +const ( + RC_BANDING = 2 + RC_BITBLT = 1 + RC_BITMAP64 = 8 + RC_DI_BITMAP = 128 + RC_DIBTODEV = 512 + RC_FLOODFILL = 4096 + RC_GDI20_OUTPUT = 16 + RC_PALETTE = 256 + RC_SCALING = 4 + RC_STRETCHBLT = 2048 + RC_STRETCHDIB = 8192 + RC_DEVBITS = 0x8000 + RC_OP_DX_OUTPUT = 0x4000 +) + +// GetDeviceCaps CURVECAPS constants +const ( + CC_NONE = 0 + CC_CIRCLES = 1 + CC_PIE = 2 + CC_CHORD = 4 + CC_ELLIPSES = 8 + CC_WIDE = 16 + CC_STYLED = 32 + CC_WIDESTYLED = 64 + CC_INTERIORS = 128 + CC_ROUNDRECT = 256 +) + +// GetDeviceCaps LINECAPS constants +const ( + LC_NONE = 0 + LC_POLYLINE = 2 + LC_MARKER = 4 + LC_POLYMARKER = 8 + LC_WIDE = 16 + LC_STYLED = 32 + LC_WIDESTYLED = 64 + LC_INTERIORS = 128 +) + +// GetDeviceCaps POLYGONALCAPS constants +const ( + PC_NONE = 0 + PC_POLYGON = 1 + PC_POLYPOLYGON = 256 + PC_PATHS = 512 + PC_RECTANGLE = 2 + PC_WINDPOLYGON = 4 + PC_SCANLINE = 8 + PC_TRAPEZOID = 4 + PC_WIDE = 16 + PC_STYLED = 32 + PC_WIDESTYLED = 64 + PC_INTERIORS = 128 +) + +// GetDeviceCaps TEXTCAPS constants +const ( + TC_OP_CHARACTER = 1 + TC_OP_STROKE = 2 + TC_CP_STROKE = 4 + TC_CR_90 = 8 + TC_CR_ANY = 16 + TC_SF_X_YINDEP = 32 + TC_SA_DOUBLE = 64 + TC_SA_INTEGER = 128 + TC_SA_CONTIN = 256 + TC_EA_DOUBLE = 512 + TC_IA_ABLE = 1024 + TC_UA_ABLE = 2048 + TC_SO_ABLE = 4096 + TC_RA_ABLE = 8192 + TC_VA_ABLE = 16384 + TC_RESERVED = 32768 + TC_SCROLLBLT = 65536 +) + +// Static control styles +const ( + SS_BITMAP = 14 + SS_BLACKFRAME = 7 + SS_BLACKRECT = 4 + SS_CENTER = 1 + SS_CENTERIMAGE = 512 + SS_EDITCONTROL = 0x2000 + SS_ENHMETAFILE = 15 + SS_ETCHEDFRAME = 18 + SS_ETCHEDHORZ = 16 + SS_ETCHEDVERT = 17 + SS_GRAYFRAME = 8 + SS_GRAYRECT = 5 + SS_ICON = 3 + SS_LEFT = 0 + SS_LEFTNOWORDWRAP = 0xC + SS_NOPREFIX = 128 + SS_NOTIFY = 256 + SS_OWNERDRAW = 0xD + SS_REALSIZECONTROL = 0x040 + SS_REALSIZEIMAGE = 0x800 + SS_RIGHT = 2 + SS_RIGHTJUST = 0x400 + SS_SIMPLE = 11 + SS_SUNKEN = 4096 + SS_WHITEFRAME = 9 + SS_WHITERECT = 6 + SS_USERITEM = 10 + SS_TYPEMASK = 0x0000001F + SS_ENDELLIPSIS = 0x00004000 + SS_PATHELLIPSIS = 0x00008000 + SS_WORDELLIPSIS = 0x0000C000 + SS_ELLIPSISMASK = 0x0000C000 +) + +// Edit styles +const ( + ES_LEFT = 0x0000 + ES_CENTER = 0x0001 + ES_RIGHT = 0x0002 + ES_MULTILINE = 0x0004 + ES_UPPERCASE = 0x0008 + ES_LOWERCASE = 0x0010 + ES_PASSWORD = 0x0020 + ES_AUTOVSCROLL = 0x0040 + ES_AUTOHSCROLL = 0x0080 + ES_NOHIDESEL = 0x0100 + ES_OEMCONVERT = 0x0400 + ES_READONLY = 0x0800 + ES_WANTRETURN = 0x1000 + ES_NUMBER = 0x2000 +) + +// Edit notifications +const ( + EN_SETFOCUS = 0x0100 + EN_KILLFOCUS = 0x0200 + EN_CHANGE = 0x0300 + EN_UPDATE = 0x0400 + EN_ERRSPACE = 0x0500 + EN_MAXTEXT = 0x0501 + EN_HSCROLL = 0x0601 + EN_VSCROLL = 0x0602 + EN_ALIGN_LTR_EC = 0x0700 + EN_ALIGN_RTL_EC = 0x0701 +) + +// Edit messages +const ( + EM_GETSEL = 0x00B0 + EM_SETSEL = 0x00B1 + EM_GETRECT = 0x00B2 + EM_SETRECT = 0x00B3 + EM_SETRECTNP = 0x00B4 + EM_SCROLL = 0x00B5 + EM_LINESCROLL = 0x00B6 + EM_SCROLLCARET = 0x00B7 + EM_GETMODIFY = 0x00B8 + EM_SETMODIFY = 0x00B9 + EM_GETLINECOUNT = 0x00BA + EM_LINEINDEX = 0x00BB + EM_SETHANDLE = 0x00BC + EM_GETHANDLE = 0x00BD + EM_GETTHUMB = 0x00BE + EM_LINELENGTH = 0x00C1 + EM_REPLACESEL = 0x00C2 + EM_GETLINE = 0x00C4 + EM_LIMITTEXT = 0x00C5 + EM_CANUNDO = 0x00C6 + EM_UNDO = 0x00C7 + EM_FMTLINES = 0x00C8 + EM_LINEFROMCHAR = 0x00C9 + EM_SETTABSTOPS = 0x00CB + EM_SETPASSWORDCHAR = 0x00CC + EM_EMPTYUNDOBUFFER = 0x00CD + EM_GETFIRSTVISIBLELINE = 0x00CE + EM_SETREADONLY = 0x00CF + EM_SETWORDBREAKPROC = 0x00D0 + EM_GETWORDBREAKPROC = 0x00D1 + EM_GETPASSWORDCHAR = 0x00D2 + EM_SETMARGINS = 0x00D3 + EM_GETMARGINS = 0x00D4 + EM_SETLIMITTEXT = EM_LIMITTEXT + EM_GETLIMITTEXT = 0x00D5 + EM_POSFROMCHAR = 0x00D6 + EM_CHARFROMPOS = 0x00D7 + EM_SETIMESTATUS = 0x00D8 + EM_GETIMESTATUS = 0x00D9 + EM_SETCUEBANNER = 0x1501 + EM_GETCUEBANNER = 0x1502 + EM_AUTOURLDETECT = 0x45B + EM_CANPASTE = 0x432 + EM_CANREDO = 0x455 + EM_DISPLAYBAND = 0x433 + EM_EXGETSEL = 0x434 + EM_EXLIMITTEXT = 0x435 + EM_EXLINEFROMCHAR = 0x436 + EM_EXSETSEL = 0x437 + EM_FINDTEXT = 0x438 + EM_FINDTEXTEX = 0x44F + EM_FINDTEXTEXW = 0x47C + EM_FINDTEXTW = 0x47B + EM_FINDWORDBREAK = 0x44C + EM_FORMATRANGE = 0x439 + EM_GETAUTOURLDETECT = 0x45C + EM_GETBIDIOPTIONS = 0x4C9 + EM_GETCHARFORMAT = 0x43A + EM_GETEDITSTYLE = 0x4CD + EM_GETEVENTMASK = 0x43B + EM_GETIMECOLOR = 0x469 + EM_GETIMECOMPMODE = 0x47A + EM_GETIMEOPTIONS = 0x46B + EM_GETLANGOPTIONS = 0x479 + EM_GETOLEINTERFACE = 0x43C + EM_GETOPTIONS = 0x44E + EM_GETPARAFORMAT = 0x43D + EM_GETPUNCTUATION = 0x465 + EM_GETREDONAME = 0x457 + EM_GETSCROLLPOS = 0x4DD + EM_GETSELTEXT = 0x43E + EM_GETTEXTEX = 0x45E + EM_GETTEXTLENGTHEX = 0x45F + EM_GETTEXTMODE = 0x45A + EM_GETTEXTRANGE = 0x44B + EM_GETTYPOGRAPHYOPTIONS = 0x4CB + EM_GETUNDONAME = 0x456 + EM_GETWORDBREAKPROCEX = 0x450 + EM_GETWORDWRAPMODE = 0x467 + EM_GETZOOM = 0x4E0 + EM_HIDESELECTION = 0x43F + EM_PASTESPECIAL = 0x440 + EM_RECONVERSION = 0x47D + EM_REDO = 0x454 + EM_REQUESTRESIZE = 0x441 + EM_SELECTIONTYPE = 0x442 + EM_SETBIDIOPTIONS = 0x4C8 + EM_SETBKGNDCOLOR = 0x443 + EM_SETCHARFORMAT = 0x444 + EM_SETEDITSTYLE = 0x4CC + EM_SETEVENTMASK = 0x445 + EM_SETFONTSIZE = 0x4DF + EM_SETIMECOLOR = 0x468 + EM_SETIMEOPTIONS = 0x46A + EM_SETLANGOPTIONS = 0x478 + EM_SETOLECALLBACK = 0x446 + EM_SETOPTIONS = 0x44D + EM_SETPALETTE = 0x45D + EM_SETPARAFORMAT = 0x447 + EM_SETPUNCTUATION = 0x464 + EM_SETSCROLLPOS = 0x4DE + EM_SETTARGETDEVICE = 0x448 + EM_SETTEXTEX = 0x461 + EM_SETTEXTMODE = 0x459 + EM_SETTYPOGRAPHYOPTIONS = 0x4CA + EM_SETUNDOLIMIT = 0x452 + EM_SETWORDBREAKPROCEX = 0x451 + EM_SETWORDWRAPMODE = 0x466 + EM_SETZOOM = 0x4E1 + EM_SHOWSCROLLBAR = 0x460 + EM_STOPGROUPTYPING = 0x458 + EM_STREAMIN = 0x449 + EM_STREAMOUT = 0x44A +) + +const ( + CCM_FIRST = 0x2000 + CCM_LAST = CCM_FIRST + 0x0200 + CCM_SETBKCOLOR = CCM_FIRST + 1 + CCM_SETCOLORSCHEME = CCM_FIRST + 2 + CCM_GETCOLORSCHEME = CCM_FIRST + 3 + CCM_GETDROPTARGET = CCM_FIRST + 4 + CCM_SETUNICODEFORMAT = CCM_FIRST + 5 + CCM_GETUNICODEFORMAT = CCM_FIRST + 6 + CCM_SETVERSION = CCM_FIRST + 7 + CCM_GETVERSION = CCM_FIRST + 8 + CCM_SETNOTIFYWINDOW = CCM_FIRST + 9 + CCM_SETWINDOWTHEME = CCM_FIRST + 11 + CCM_DPISCALE = CCM_FIRST + 12 +) + +// Common controls styles +const ( + CCS_TOP = 1 + CCS_NOMOVEY = 2 + CCS_BOTTOM = 3 + CCS_NORESIZE = 4 + CCS_NOPARENTALIGN = 8 + CCS_ADJUSTABLE = 32 + CCS_NODIVIDER = 64 + CCS_VERT = 128 + CCS_LEFT = 129 + CCS_NOMOVEX = 130 + CCS_RIGHT = 131 +) + +// ProgressBar messages +const ( + PROGRESS_CLASS = "msctls_progress32" + PBM_SETRANGE = WM_USER + 1 + PBM_SETPOS = WM_USER + 2 + PBM_DELTAPOS = WM_USER + 3 + PBM_SETSTEP = WM_USER + 4 + PBM_STEPIT = WM_USER + 5 + PBM_SETRANGE32 = WM_USER + 6 + PBM_GETRANGE = WM_USER + 7 + PBM_GETPOS = WM_USER + 8 + PBM_SETBARCOLOR = WM_USER + 9 + PBM_SETMARQUEE = WM_USER + 10 + PBM_SETBKCOLOR = CCM_SETBKCOLOR +) + +// Progress bar styles. +const ( + PBS_SMOOTH = 0x01 + PBS_VERTICAL = 0x04 + PBS_MARQUEE = 0x08 + PBS_SMOOTHREVERSE = 0x10 +) + +// GetOpenFileName and GetSaveFileName extended flags +const ( + OFN_EX_NOPLACESBAR = 0x00000001 +) + +// GetOpenFileName and GetSaveFileName flags +const ( + OFN_ALLOWMULTISELECT = 0x00000200 + OFN_CREATEPROMPT = 0x00002000 + OFN_DONTADDTORECENT = 0x02000000 + OFN_ENABLEHOOK = 0x00000020 + OFN_ENABLEINCLUDENOTIFY = 0x00400000 + OFN_ENABLESIZING = 0x00800000 + OFN_ENABLETEMPLATE = 0x00000040 + OFN_ENABLETEMPLATEHANDLE = 0x00000080 + OFN_EXPLORER = 0x00080000 + OFN_EXTENSIONDIFFERENT = 0x00000400 + OFN_FILEMUSTEXIST = 0x00001000 + OFN_FORCESHOWHIDDEN = 0x10000000 + OFN_HIDEREADONLY = 0x00000004 + OFN_LONGNAMES = 0x00200000 + OFN_NOCHANGEDIR = 0x00000008 + OFN_NODEREFERENCELINKS = 0x00100000 + OFN_NOLONGNAMES = 0x00040000 + OFN_NONETWORKBUTTON = 0x00020000 + OFN_NOREADONLYRETURN = 0x00008000 + OFN_NOTESTFILECREATE = 0x00010000 + OFN_NOVALIDATE = 0x00000100 + OFN_OVERWRITEPROMPT = 0x00000002 + OFN_PATHMUSTEXIST = 0x00000800 + OFN_READONLY = 0x00000001 + OFN_SHAREAWARE = 0x00004000 + OFN_SHOWHELP = 0x00000010 +) + +// SHBrowseForFolder flags +const ( + BIF_RETURNONLYFSDIRS = 0x00000001 + BIF_DONTGOBELOWDOMAIN = 0x00000002 + BIF_STATUSTEXT = 0x00000004 + BIF_RETURNFSANCESTORS = 0x00000008 + BIF_EDITBOX = 0x00000010 + BIF_VALIDATE = 0x00000020 + BIF_NEWDIALOGSTYLE = 0x00000040 + BIF_BROWSEINCLUDEURLS = 0x00000080 + BIF_USENEWUI = BIF_EDITBOX | BIF_NEWDIALOGSTYLE + BIF_UAHINT = 0x00000100 + BIF_NONEWFOLDERBUTTON = 0x00000200 + BIF_NOTRANSLATETARGETS = 0x00000400 + BIF_BROWSEFORCOMPUTER = 0x00001000 + BIF_BROWSEFORPRINTER = 0x00002000 + BIF_BROWSEINCLUDEFILES = 0x00004000 + BIF_SHAREABLE = 0x00008000 + BIF_BROWSEFILEJUNCTIONS = 0x00010000 +) + +// MessageBox flags +const ( + MB_OK = 0x00000000 + MB_OKCANCEL = 0x00000001 + MB_ABORTRETRYIGNORE = 0x00000002 + MB_YESNOCANCEL = 0x00000003 + MB_YESNO = 0x00000004 + MB_RETRYCANCEL = 0x00000005 + MB_CANCELTRYCONTINUE = 0x00000006 + MB_ICONHAND = 0x00000010 + MB_ICONQUESTION = 0x00000020 + MB_ICONEXCLAMATION = 0x00000030 + MB_ICONASTERISK = 0x00000040 + MB_USERICON = 0x00000080 + MB_ICONWARNING = MB_ICONEXCLAMATION + MB_ICONERROR = MB_ICONHAND + MB_ICONINFORMATION = MB_ICONASTERISK + MB_ICONSTOP = MB_ICONHAND + MB_DEFBUTTON1 = 0x00000000 + MB_DEFBUTTON2 = 0x00000100 + MB_DEFBUTTON3 = 0x00000200 + MB_DEFBUTTON4 = 0x00000300 + MB_TOPMOST = 0x00040000 +) + +// COM +const ( + E_INVALIDARG = 0x80070057 + E_OUTOFMEMORY = 0x8007000E + E_UNEXPECTED = 0x8000FFFF +) + +const ( + S_OK = 0 + S_FALSE = 0x0001 + RPC_E_CHANGED_MODE = 0x80010106 +) + +// GetSystemMetrics constants +const ( + SM_CXSCREEN = 0 + SM_CYSCREEN = 1 + SM_CXVSCROLL = 2 + SM_CYHSCROLL = 3 + SM_CYCAPTION = 4 + SM_CXBORDER = 5 + SM_CYBORDER = 6 + SM_CXDLGFRAME = 7 + SM_CYDLGFRAME = 8 + SM_CYVTHUMB = 9 + SM_CXHTHUMB = 10 + SM_CXICON = 11 + SM_CYICON = 12 + SM_CXCURSOR = 13 + SM_CYCURSOR = 14 + SM_CYMENU = 15 + SM_CXFULLSCREEN = 16 + SM_CYFULLSCREEN = 17 + SM_CYKANJIWINDOW = 18 + SM_MOUSEPRESENT = 19 + SM_CYVSCROLL = 20 + SM_CXHSCROLL = 21 + SM_DEBUG = 22 + SM_SWAPBUTTON = 23 + SM_RESERVED1 = 24 + SM_RESERVED2 = 25 + SM_RESERVED3 = 26 + SM_RESERVED4 = 27 + SM_CXMIN = 28 + SM_CYMIN = 29 + SM_CXSIZE = 30 + SM_CYSIZE = 31 + SM_CXFRAME = 32 + SM_CYFRAME = 33 + SM_CXMINTRACK = 34 + SM_CYMINTRACK = 35 + SM_CXDOUBLECLK = 36 + SM_CYDOUBLECLK = 37 + SM_CXICONSPACING = 38 + SM_CYICONSPACING = 39 + SM_MENUDROPALIGNMENT = 40 + SM_PENWINDOWS = 41 + SM_DBCSENABLED = 42 + SM_CMOUSEBUTTONS = 43 + SM_CXFIXEDFRAME = SM_CXDLGFRAME + SM_CYFIXEDFRAME = SM_CYDLGFRAME + SM_CXSIZEFRAME = SM_CXFRAME + SM_CYSIZEFRAME = SM_CYFRAME + SM_SECURE = 44 + SM_CXEDGE = 45 + SM_CYEDGE = 46 + SM_CXMINSPACING = 47 + SM_CYMINSPACING = 48 + SM_CXSMICON = 49 + SM_CYSMICON = 50 + SM_CYSMCAPTION = 51 + SM_CXSMSIZE = 52 + SM_CYSMSIZE = 53 + SM_CXMENUSIZE = 54 + SM_CYMENUSIZE = 55 + SM_ARRANGE = 56 + SM_CXMINIMIZED = 57 + SM_CYMINIMIZED = 58 + SM_CXMAXTRACK = 59 + SM_CYMAXTRACK = 60 + SM_CXMAXIMIZED = 61 + SM_CYMAXIMIZED = 62 + SM_NETWORK = 63 + SM_CLEANBOOT = 67 + SM_CXDRAG = 68 + SM_CYDRAG = 69 + SM_SHOWSOUNDS = 70 + SM_CXMENUCHECK = 71 + SM_CYMENUCHECK = 72 + SM_SLOWMACHINE = 73 + SM_MIDEASTENABLED = 74 + SM_MOUSEWHEELPRESENT = 75 + SM_XVIRTUALSCREEN = 76 + SM_YVIRTUALSCREEN = 77 + SM_CXVIRTUALSCREEN = 78 + SM_CYVIRTUALSCREEN = 79 + SM_CMONITORS = 80 + SM_SAMEDISPLAYFORMAT = 81 + SM_IMMENABLED = 82 + SM_CXFOCUSBORDER = 83 + SM_CYFOCUSBORDER = 84 + SM_TABLETPC = 86 + SM_MEDIACENTER = 87 + SM_STARTER = 88 + SM_SERVERR2 = 89 + SM_CMETRICS = 97 + SM_REMOTESESSION = 0x1000 + SM_SHUTTINGDOWN = 0x2000 + SM_REMOTECONTROL = 0x2001 + SM_CARETBLINKINGENABLED = 0x2002 +) + +const ( + CLSCTX_INPROC_SERVER = 1 + CLSCTX_INPROC_HANDLER = 2 + CLSCTX_LOCAL_SERVER = 4 + CLSCTX_INPROC_SERVER16 = 8 + CLSCTX_REMOTE_SERVER = 16 + CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER + CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER + CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER +) + +const ( + COINIT_APARTMENTTHREADED = 0x2 + COINIT_MULTITHREADED = 0x0 + COINIT_DISABLE_OLE1DDE = 0x4 + COINIT_SPEED_OVER_MEMORY = 0x8 +) + +const ( + DISPATCH_METHOD = 1 + DISPATCH_PROPERTYGET = 2 + DISPATCH_PROPERTYPUT = 4 + DISPATCH_PROPERTYPUTREF = 8 +) + +const ( + CC_FASTCALL = 0 + CC_CDECL = 1 + CC_MSCPASCAL = 2 + CC_PASCAL = CC_MSCPASCAL + CC_MACPASCAL = 3 + CC_STDCALL = 4 + CC_FPFASTCALL = 5 + CC_SYSCALL = 6 + CC_MPWCDECL = 7 + CC_MPWPASCAL = 8 + CC_MAX = 9 +) + +const ( + VT_EMPTY = 0x0 + VT_NULL = 0x1 + VT_I2 = 0x2 + VT_I4 = 0x3 + VT_R4 = 0x4 + VT_R8 = 0x5 + VT_CY = 0x6 + VT_DATE = 0x7 + VT_BSTR = 0x8 + VT_DISPATCH = 0x9 + VT_ERROR = 0xA + VT_BOOL = 0xB + VT_VARIANT = 0xC + VT_UNKNOWN = 0xD + VT_DECIMAL = 0xE + VT_I1 = 0x10 + VT_UI1 = 0x11 + VT_UI2 = 0x12 + VT_UI4 = 0x13 + VT_I8 = 0x14 + VT_UI8 = 0x15 + VT_INT = 0x16 + VT_UINT = 0x17 + VT_VOID = 0x18 + VT_HRESULT = 0x19 + VT_PTR = 0x1A + VT_SAFEARRAY = 0x1B + VT_CARRAY = 0x1C + VT_USERDEFINED = 0x1D + VT_LPSTR = 0x1E + VT_LPWSTR = 0x1F + VT_RECORD = 0x24 + VT_INT_PTR = 0x25 + VT_UINT_PTR = 0x26 + VT_FILETIME = 0x40 + VT_BLOB = 0x41 + VT_STREAM = 0x42 + VT_STORAGE = 0x43 + VT_STREAMED_OBJECT = 0x44 + VT_STORED_OBJECT = 0x45 + VT_BLOB_OBJECT = 0x46 + VT_CF = 0x47 + VT_CLSID = 0x48 + VT_BSTR_BLOB = 0xFFF + VT_VECTOR = 0x1000 + VT_ARRAY = 0x2000 + VT_BYREF = 0x4000 + VT_RESERVED = 0x8000 + VT_ILLEGAL = 0xFFFF + VT_ILLEGALMASKED = 0xFFF + VT_TYPEMASK = 0xFFF +) + +const ( + DISPID_UNKNOWN = -1 + DISPID_VALUE = 0 + DISPID_PROPERTYPUT = -3 + DISPID_NEWENUM = -4 + DISPID_EVALUATE = -5 + DISPID_CONSTRUCTOR = -6 + DISPID_DESTRUCTOR = -7 + DISPID_COLLECT = -8 +) + +const ( + MONITOR_DEFAULTTONULL = 0x00000000 + MONITOR_DEFAULTTOPRIMARY = 0x00000001 + MONITOR_DEFAULTTONEAREST = 0x00000002 + + MONITORINFOF_PRIMARY = 0x00000001 +) + +const ( + CCHDEVICENAME = 32 + CCHFORMNAME = 32 +) + +const ( + IDOK = 1 + IDCANCEL = 2 + IDABORT = 3 + IDRETRY = 4 + IDIGNORE = 5 + IDYES = 6 + IDNO = 7 + IDCLOSE = 8 + IDHELP = 9 + IDTRYAGAIN = 10 + IDCONTINUE = 11 + IDTIMEOUT = 32000 +) + +// Generic WM_NOTIFY notification codes +const ( + NM_FIRST = 0 + NM_OUTOFMEMORY = NM_FIRST - 1 + NM_CLICK = NM_FIRST - 2 + NM_DBLCLK = NM_FIRST - 3 + NM_RETURN = NM_FIRST - 4 + NM_RCLICK = NM_FIRST - 5 + NM_RDBLCLK = NM_FIRST - 6 + NM_SETFOCUS = NM_FIRST - 7 + NM_KILLFOCUS = NM_FIRST - 8 + NM_CUSTOMDRAW = NM_FIRST - 12 + NM_HOVER = NM_FIRST - 13 + NM_NCHITTEST = NM_FIRST - 14 + NM_KEYDOWN = NM_FIRST - 15 + NM_RELEASEDCAPTURE = NM_FIRST - 16 + NM_SETCURSOR = NM_FIRST - 17 + NM_CHAR = NM_FIRST - 18 + NM_TOOLTIPSCREATED = NM_FIRST - 19 + NM_LAST = NM_FIRST - 99 +) + +// ListView messages +const ( + // https://wiki.winehq.org/List_Of_Windows_Messages + LVM_FIRST = 0x1000 + LVM_GETITEMCOUNT = 0x1004 + LVM_SETIMAGELIST = 0x1003 + LVM_GETIMAGELIST = 0x1002 + LVM_GETITEM = 0x104B + LVM_SETITEM = 0x104C + LVM_INSERTITEM = 0x104D + LVM_DELETEITEM = 0x1008 + LVM_DELETEALLITEMS = 0x1009 + LVM_GETCALLBACKMASK = 0x100A + LVM_SETCALLBACKMASK = 0x100B + LVM_SETUNICODEFORMAT = 0x2005 + LVM_GETNEXTITEM = 0x100C + LVM_FINDITEM = 0x1053 + LVM_GETITEMRECT = 0x100E + LVM_GETSTRINGWIDTH = 0x1057 + LVM_HITTEST = 0x1012 + LVM_ENSUREVISIBLE = 0x1013 + LVM_SCROLL = 0x1014 + LVM_REDRAWITEMS = 0x1015 + LVM_ARRANGE = 0x1016 + LVM_EDITLABEL = 0x1076 + LVM_GETEDITCONTROL = 0x1018 + LVM_GETCOLUMN = 0x105F + LVM_SETCOLUMN = 0x1060 + LVM_INSERTCOLUMN = 0x1061 + LVM_DELETECOLUMN = 0x101C + LVM_GETCOLUMNWIDTH = 0x101D + LVM_SETCOLUMNWIDTH = 0x101E + LVM_GETHEADER = 0x101F + LVM_CREATEDRAGIMAGE = 0x1021 + LVM_GETVIEWRECT = 0x1022 + LVM_GETTEXTCOLOR = 0x1023 + LVM_SETTEXTCOLOR = 0x1024 + LVM_GETTEXTBKCOLOR = 0x1025 + LVM_SETTEXTBKCOLOR = 0x1026 + LVM_GETTOPINDEX = 0x1027 + LVM_GETCOUNTPERPAGE = 0x1028 + LVM_GETORIGIN = 0x1029 + LVM_UPDATE = 0x102A + LVM_SETITEMSTATE = 0x102B + LVM_GETITEMSTATE = 0x102C + LVM_GETITEMTEXT = 0x1073 + LVM_SETITEMTEXT = 0x1074 + LVM_SETITEMCOUNT = 0x102F + LVM_SORTITEMS = 0x1030 + LVM_SETITEMPOSITION32 = 0x1031 + LVM_GETSELECTEDCOUNT = 0x1032 + LVM_GETITEMSPACING = 0x1033 + LVM_GETISEARCHSTRING = 0x1075 + LVM_SETICONSPACING = 0x1035 + LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1036 + LVM_GETEXTENDEDLISTVIEWSTYLE = 0x1037 + LVM_GETSUBITEMRECT = 0x1038 + LVM_SUBITEMHITTEST = 0x1039 + LVM_SETCOLUMNORDERARRAY = 0x103A + LVM_GETCOLUMNORDERARRAY = 0x103B + LVM_SETHOTITEM = 0x103C + LVM_GETHOTITEM = 0x103D + LVM_SETHOTCURSOR = 0x103E + LVM_GETHOTCURSOR = 0x103F + LVM_APPROXIMATEVIEWRECT = 0x1040 + LVM_SETWORKAREAS = 0x1041 + LVM_GETWORKAREAS = 0x1046 + LVM_GETNUMBEROFWORKAREAS = 0x1049 + LVM_GETSELECTIONMARK = 0x1042 + LVM_SETSELECTIONMARK = 0x1043 + LVM_SETHOVERTIME = 0x1047 + LVM_GETHOVERTIME = 0x1048 + LVM_SETTOOLTIPS = 0x104A + LVM_GETTOOLTIPS = 0x104E + LVM_SORTITEMSEX = 0x1051 + LVM_SETBKIMAGE = 0x1044 + LVM_GETBKIMAGE = 0x108B + LVM_SETSELECTEDCOLUMN = 0x108C + LVM_SETVIEW = 0x108E + LVM_GETVIEW = 0x108F + LVM_INSERTGROUP = 0x1091 + LVM_SETGROUPINFO = 0x1093 + LVM_GETGROUPINFO = 0x1095 + LVM_REMOVEGROUP = 0x1096 + LVM_MOVEGROUP = 0x1097 + LVM_GETGROUPCOUNT = 0x1098 + LVM_GETGROUPINFOBYINDEX = 0x1099 + LVM_MOVEITEMTOGROUP = 0x109A + LVM_GETGROUPRECT = 0x1062 + LVM_SETGROUPMETRICS = 0x109B + LVM_GETGROUPMETRICS = 0x109C + LVM_ENABLEGROUPVIEW = 0x109D + LVM_SORTGROUPS = 0x109E + LVM_INSERTGROUPSORTED = 0x109F + LVM_REMOVEALLGROUPS = 0x10A0 + LVM_HASGROUP = 0x10A1 + LVM_GETGROUPSTATE = 0x105C + LVM_GETFOCUSEDGROUP = 0x105D + LVM_SETTILEVIEWINFO = 0x10A2 + LVM_GETTILEVIEWINFO = 0x10A3 + LVM_SETTILEINFO = 0x10A4 + LVM_GETTILEINFO = 0x10A5 + LVM_SETINSERTMARK = 0x10A6 + LVM_GETINSERTMARK = 0x10A7 + LVM_INSERTMARKHITTEST = 0x10A8 + LVM_GETINSERTMARKRECT = 0x10A9 + LVM_SETINSERTMARKCOLOR = 0x10AA + LVM_GETINSERTMARKCOLOR = 0x10AB + LVM_SETINFOTIP = 0x10AD + LVM_GETSELECTEDCOLUMN = 0x10AE + LVM_ISGROUPVIEWENABLED = 0x10AF + LVM_GETOUTLINECOLOR = 0x10B0 + LVM_SETOUTLINECOLOR = 0x10B1 + LVM_CANCELEDITLABEL = 0x10B3 + LVM_MAPINDEXTOID = 0x10B4 + LVM_MAPIDTOINDEX = 0x10B5 + LVM_ISITEMVISIBLE = 0x10B6 + LVM_GETNEXTITEMINDEX = 0x10D3 +) + +// ListView notifications +const ( + LVN_FIRST = -100 + + LVN_ITEMCHANGING = LVN_FIRST - 0 + LVN_ITEMCHANGED = LVN_FIRST - 1 + LVN_INSERTITEM = LVN_FIRST - 2 + LVN_DELETEITEM = LVN_FIRST - 3 + LVN_DELETEALLITEMS = LVN_FIRST - 4 + LVN_BEGINLABELEDITA = LVN_FIRST - 5 + LVN_BEGINLABELEDITW = LVN_FIRST - 75 + LVN_ENDLABELEDITA = LVN_FIRST - 6 + LVN_ENDLABELEDITW = LVN_FIRST - 76 + LVN_COLUMNCLICK = LVN_FIRST - 8 + LVN_BEGINDRAG = LVN_FIRST - 9 + LVN_BEGINRDRAG = LVN_FIRST - 11 + LVN_ODCACHEHINT = LVN_FIRST - 13 + LVN_ODFINDITEMA = LVN_FIRST - 52 + LVN_ODFINDITEMW = LVN_FIRST - 79 + LVN_ITEMACTIVATE = LVN_FIRST - 14 + LVN_ODSTATECHANGED = LVN_FIRST - 15 + LVN_HOTTRACK = LVN_FIRST - 21 + LVN_GETDISPINFO = LVN_FIRST - 50 + LVN_SETDISPINFO = LVN_FIRST - 51 + LVN_KEYDOWN = LVN_FIRST - 55 + LVN_MARQUEEBEGIN = LVN_FIRST - 56 + LVN_GETINFOTIP = LVN_FIRST - 57 + LVN_INCREMENTALSEARCH = LVN_FIRST - 62 + LVN_BEGINSCROLL = LVN_FIRST - 80 + LVN_ENDSCROLL = LVN_FIRST - 81 +) + +// ListView LVNI constants +const ( + LVNI_ALL = 0 + LVNI_FOCUSED = 1 + LVNI_SELECTED = 2 + LVNI_CUT = 4 + LVNI_DROPHILITED = 8 + LVNI_ABOVE = 256 + LVNI_BELOW = 512 + LVNI_TOLEFT = 1024 + LVNI_TORIGHT = 2048 +) + +// ListView styles +const ( + LVS_ICON = 0x0000 + LVS_REPORT = 0x0001 + LVS_SMALLICON = 0x0002 + LVS_LIST = 0x0003 + LVS_TYPEMASK = 0x0003 + LVS_SINGLESEL = 0x0004 + LVS_SHOWSELALWAYS = 0x0008 + LVS_SORTASCENDING = 0x0010 + LVS_SORTDESCENDING = 0x0020 + LVS_SHAREIMAGELISTS = 0x0040 + LVS_NOLABELWRAP = 0x0080 + LVS_AUTOARRANGE = 0x0100 + LVS_EDITLABELS = 0x0200 + LVS_OWNERDATA = 0x1000 + LVS_NOSCROLL = 0x2000 + LVS_TYPESTYLEMASK = 0xFC00 + LVS_ALIGNTOP = 0x0000 + LVS_ALIGNLEFT = 0x0800 + LVS_ALIGNMASK = 0x0C00 + LVS_OWNERDRAWFIXED = 0x0400 + LVS_NOCOLUMNHEADER = 0x4000 + LVS_NOSORTHEADER = 0x8000 +) + +// ListView extended styles +const ( + LVS_EX_GRIDLINES = 0x00000001 + LVS_EX_SUBITEMIMAGES = 0x00000002 + LVS_EX_CHECKBOXES = 0x00000004 + LVS_EX_TRACKSELECT = 0x00000008 + LVS_EX_HEADERDRAGDROP = 0x00000010 + LVS_EX_FULLROWSELECT = 0x00000020 + LVS_EX_ONECLICKACTIVATE = 0x00000040 + LVS_EX_TWOCLICKACTIVATE = 0x00000080 + LVS_EX_FLATSB = 0x00000100 + LVS_EX_REGIONAL = 0x00000200 + LVS_EX_INFOTIP = 0x00000400 + LVS_EX_UNDERLINEHOT = 0x00000800 + LVS_EX_UNDERLINECOLD = 0x00001000 + LVS_EX_MULTIWORKAREAS = 0x00002000 + LVS_EX_LABELTIP = 0x00004000 + LVS_EX_BORDERSELECT = 0x00008000 + LVS_EX_DOUBLEBUFFER = 0x00010000 + LVS_EX_HIDELABELS = 0x00020000 + LVS_EX_SINGLEROW = 0x00040000 + LVS_EX_SNAPTOGRID = 0x00080000 + LVS_EX_SIMPLESELECT = 0x00100000 +) + +// ListView column flags +const ( + LVCF_FMT = 0x0001 + LVCF_WIDTH = 0x0002 + LVCF_TEXT = 0x0004 + LVCF_SUBITEM = 0x0008 + LVCF_IMAGE = 0x0010 + LVCF_ORDER = 0x0020 +) + +// ListView column format constants +const ( + LVCFMT_LEFT = 0x0000 + LVCFMT_RIGHT = 0x0001 + LVCFMT_CENTER = 0x0002 + LVCFMT_JUSTIFYMASK = 0x0003 + LVCFMT_IMAGE = 0x0800 + LVCFMT_BITMAP_ON_RIGHT = 0x1000 + LVCFMT_COL_HAS_IMAGES = 0x8000 +) + +// ListView item flags +const ( + LVIF_TEXT = 0x00000001 + LVIF_IMAGE = 0x00000002 + LVIF_PARAM = 0x00000004 + LVIF_STATE = 0x00000008 + LVIF_INDENT = 0x00000010 + LVIF_NORECOMPUTE = 0x00000800 + LVIF_GROUPID = 0x00000100 + LVIF_COLUMNS = 0x00000200 +) + +// ListView item states +const ( + LVIS_FOCUSED = 1 + LVIS_SELECTED = 2 + LVIS_CUT = 4 + LVIS_DROPHILITED = 8 + LVIS_OVERLAYMASK = 0xF00 + LVIS_STATEIMAGEMASK = 0xF000 +) + +// ListView hit test constants +const ( + LVHT_NOWHERE = 0x00000001 + LVHT_ONITEMICON = 0x00000002 + LVHT_ONITEMLABEL = 0x00000004 + LVHT_ONITEMSTATEICON = 0x00000008 + LVHT_ONITEM = LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON + + LVHT_ABOVE = 0x00000008 + LVHT_BELOW = 0x00000010 + LVHT_TORIGHT = 0x00000020 + LVHT_TOLEFT = 0x00000040 +) + +// ListView image list types +const ( + LVSIL_NORMAL = 0 + LVSIL_SMALL = 1 + LVSIL_STATE = 2 + LVSIL_GROUPHEADER = 3 +) + +// InitCommonControlsEx flags +const ( + ICC_LISTVIEW_CLASSES = 1 + ICC_TREEVIEW_CLASSES = 2 + ICC_BAR_CLASSES = 4 + ICC_TAB_CLASSES = 8 + ICC_UPDOWN_CLASS = 16 + ICC_PROGRESS_CLASS = 32 + ICC_HOTKEY_CLASS = 64 + ICC_ANIMATE_CLASS = 128 + ICC_WIN95_CLASSES = 255 + ICC_DATE_CLASSES = 256 + ICC_USEREX_CLASSES = 512 + ICC_COOL_CLASSES = 1024 + ICC_INTERNET_CLASSES = 2048 + ICC_PAGESCROLLER_CLASS = 4096 + ICC_NATIVEFNTCTL_CLASS = 8192 + INFOTIPSIZE = 1024 + ICC_STANDARD_CLASSES = 0x00004000 + ICC_LINK_CLASS = 0x00008000 +) + +// Dialog Codes +const ( + DLGC_WANTARROWS = 0x0001 + DLGC_WANTTAB = 0x0002 + DLGC_WANTALLKEYS = 0x0004 + DLGC_WANTMESSAGE = 0x0004 + DLGC_HASSETSEL = 0x0008 + DLGC_DEFPUSHBUTTON = 0x0010 + DLGC_UNDEFPUSHBUTTON = 0x0020 + DLGC_RADIOBUTTON = 0x0040 + DLGC_WANTCHARS = 0x0080 + DLGC_STATIC = 0x0100 + DLGC_BUTTON = 0x2000 +) + +// Get/SetWindowWord/Long offsets for use with WC_DIALOG windows +const ( + DWL_MSGRESULT = 0 + DWL_DLGPROC = 4 + DWL_USER = 8 +) + +// Registry predefined keys +const ( + HKEY_CLASSES_ROOT HKEY = 0x80000000 + HKEY_CURRENT_USER HKEY = 0x80000001 + HKEY_LOCAL_MACHINE HKEY = 0x80000002 + HKEY_USERS HKEY = 0x80000003 + HKEY_PERFORMANCE_DATA HKEY = 0x80000004 + HKEY_CURRENT_CONFIG HKEY = 0x80000005 + HKEY_DYN_DATA HKEY = 0x80000006 +) + +// Registry Key Security and Access Rights +const ( + KEY_ALL_ACCESS = 0xF003F + KEY_CREATE_SUB_KEY = 0x0004 + KEY_ENUMERATE_SUB_KEYS = 0x0008 + KEY_NOTIFY = 0x0010 + KEY_QUERY_VALUE = 0x0001 + KEY_SET_VALUE = 0x0002 + KEY_READ = 0x20019 + KEY_WRITE = 0x20006 +) + +const ( + NFR_ANSI = 1 + NFR_UNICODE = 2 + NF_QUERY = 3 + NF_REQUERY = 4 +) + +// Registry value types +const ( + RRF_RT_REG_NONE = 0x00000001 + RRF_RT_REG_SZ = 0x00000002 + RRF_RT_REG_EXPAND_SZ = 0x00000004 + RRF_RT_REG_BINARY = 0x00000008 + RRF_RT_REG_DWORD = 0x00000010 + RRF_RT_REG_MULTI_SZ = 0x00000020 + RRF_RT_REG_QWORD = 0x00000040 + RRF_RT_DWORD = RRF_RT_REG_BINARY | RRF_RT_REG_DWORD + RRF_RT_QWORD = RRF_RT_REG_BINARY | RRF_RT_REG_QWORD + RRF_RT_ANY = 0x0000FFFF + RRF_NOEXPAND = 0x10000000 + RRF_ZEROONFAILURE = 0x20000000 + REG_PROCESS_APPKEY = 0x00000001 + REG_MUI_STRING_TRUNCATE = 0x00000001 +) + +// PeekMessage wRemoveMsg value +const ( + PM_NOREMOVE = 0x000 + PM_REMOVE = 0x001 + PM_NOYIELD = 0x002 +) + +// ImageList flags +const ( + ILC_MASK = 0x00000001 + ILC_COLOR = 0x00000000 + ILC_COLORDDB = 0x000000FE + ILC_COLOR4 = 0x00000004 + ILC_COLOR8 = 0x00000008 + ILC_COLOR16 = 0x00000010 + ILC_COLOR24 = 0x00000018 + ILC_COLOR32 = 0x00000020 + ILC_PALETTE = 0x00000800 + ILC_MIRROR = 0x00002000 + ILC_PERITEMMIRROR = 0x00008000 + ILC_ORIGINALSIZE = 0x00010000 + ILC_HIGHQUALITYSCALE = 0x00020000 +) + +// Keystroke Message Flags +const ( + KF_EXTENDED = 0x0100 + KF_DLGMODE = 0x0800 + KF_MENUMODE = 0x1000 + KF_ALTDOWN = 0x2000 + KF_REPEAT = 0x4000 + KF_UP = 0x8000 +) + +// Virtual-Key Codes +const ( + VK_LBUTTON = 0x01 + VK_RBUTTON = 0x02 + VK_CANCEL = 0x03 + VK_MBUTTON = 0x04 + VK_XBUTTON1 = 0x05 + VK_XBUTTON2 = 0x06 + VK_BACK = 0x08 + VK_TAB = 0x09 + VK_CLEAR = 0x0C + VK_RETURN = 0x0D + VK_SHIFT = 0x10 + VK_CONTROL = 0x11 + VK_MENU = 0x12 + VK_PAUSE = 0x13 + VK_CAPITAL = 0x14 + VK_KANA = 0x15 + VK_HANGEUL = 0x15 + VK_HANGUL = 0x15 + VK_IME_ON = 0x16 + VK_JUNJA = 0x17 + VK_FINAL = 0x18 + VK_HANJA = 0x19 + VK_KANJI = 0x19 + VK_IME_OFF = 0x1A + VK_ESCAPE = 0x1B + VK_CONVERT = 0x1C + VK_NONCONVERT = 0x1D + VK_ACCEPT = 0x1E + VK_MODECHANGE = 0x1F + VK_SPACE = 0x20 + VK_PRIOR = 0x21 + VK_NEXT = 0x22 + VK_END = 0x23 + VK_HOME = 0x24 + VK_LEFT = 0x25 + VK_UP = 0x26 + VK_RIGHT = 0x27 + VK_DOWN = 0x28 + VK_SELECT = 0x29 + VK_PRINT = 0x2A + VK_EXECUTE = 0x2B + VK_SNAPSHOT = 0x2C + VK_INSERT = 0x2D + VK_DELETE = 0x2E + VK_HELP = 0x2F + VK_LWIN = 0x5B + VK_RWIN = 0x5C + VK_APPS = 0x5D + VK_SLEEP = 0x5F + VK_NUMPAD0 = 0x60 + VK_NUMPAD1 = 0x61 + VK_NUMPAD2 = 0x62 + VK_NUMPAD3 = 0x63 + VK_NUMPAD4 = 0x64 + VK_NUMPAD5 = 0x65 + VK_NUMPAD6 = 0x66 + VK_NUMPAD7 = 0x67 + VK_NUMPAD8 = 0x68 + VK_NUMPAD9 = 0x69 + VK_MULTIPLY = 0x6A + VK_ADD = 0x6B + VK_SEPARATOR = 0x6C + VK_SUBTRACT = 0x6D + VK_DECIMAL = 0x6E + VK_DIVIDE = 0x6F + VK_F1 = 0x70 + VK_F2 = 0x71 + VK_F3 = 0x72 + VK_F4 = 0x73 + VK_F5 = 0x74 + VK_F6 = 0x75 + VK_F7 = 0x76 + VK_F8 = 0x77 + VK_F9 = 0x78 + VK_F10 = 0x79 + VK_F11 = 0x7A + VK_F12 = 0x7B + VK_F13 = 0x7C + VK_F14 = 0x7D + VK_F15 = 0x7E + VK_F16 = 0x7F + VK_F17 = 0x80 + VK_F18 = 0x81 + VK_F19 = 0x82 + VK_F20 = 0x83 + VK_F21 = 0x84 + VK_F22 = 0x85 + VK_F23 = 0x86 + VK_F24 = 0x87 + VK_NUMLOCK = 0x90 + VK_SCROLL = 0x91 + VK_OEM_NEC_EQUAL = 0x92 + VK_OEM_FJ_JISHO = 0x92 + VK_OEM_FJ_MASSHOU = 0x93 + VK_OEM_FJ_TOUROKU = 0x94 + VK_OEM_FJ_LOYA = 0x95 + VK_OEM_FJ_ROYA = 0x96 + VK_LSHIFT = 0xA0 + VK_RSHIFT = 0xA1 + VK_LCONTROL = 0xA2 + VK_RCONTROL = 0xA3 + VK_LMENU = 0xA4 + VK_RMENU = 0xA5 + VK_BROWSER_BACK = 0xA6 + VK_BROWSER_FORWARD = 0xA7 + VK_BROWSER_REFRESH = 0xA8 + VK_BROWSER_STOP = 0xA9 + VK_BROWSER_SEARCH = 0xAA + VK_BROWSER_FAVORITES = 0xAB + VK_BROWSER_HOME = 0xAC + VK_VOLUME_MUTE = 0xAD + VK_VOLUME_DOWN = 0xAE + VK_VOLUME_UP = 0xAF + VK_MEDIA_NEXT_TRACK = 0xB0 + VK_MEDIA_PREV_TRACK = 0xB1 + VK_MEDIA_STOP = 0xB2 + VK_MEDIA_PLAY_PAUSE = 0xB3 + VK_LAUNCH_MAIL = 0xB4 + VK_LAUNCH_MEDIA_SELECT = 0xB5 + VK_LAUNCH_APP1 = 0xB6 + VK_LAUNCH_APP2 = 0xB7 + VK_OEM_1 = 0xBA + VK_OEM_PLUS = 0xBB + VK_OEM_COMMA = 0xBC + VK_OEM_MINUS = 0xBD + VK_OEM_PERIOD = 0xBE + VK_OEM_2 = 0xBF + VK_OEM_3 = 0xC0 + VK_OEM_4 = 0xDB + VK_OEM_5 = 0xDC + VK_OEM_6 = 0xDD + VK_OEM_7 = 0xDE + VK_OEM_8 = 0xDF + VK_OEM_AX = 0xE1 + VK_OEM_102 = 0xE2 + VK_ICO_HELP = 0xE3 + VK_ICO_00 = 0xE4 + VK_PROCESSKEY = 0xE5 + VK_ICO_CLEAR = 0xE6 + VK_PACKET = 0xE7 + VK_OEM_RESET = 0xE9 + VK_OEM_JUMP = 0xEA + VK_OEM_PA1 = 0xEB + VK_OEM_PA2 = 0xEC + VK_OEM_PA3 = 0xED + VK_OEM_WSCTRL = 0xEE + VK_OEM_CUSEL = 0xEF + VK_OEM_ATTN = 0xF0 + VK_OEM_FINISH = 0xF1 + VK_OEM_COPY = 0xF2 + VK_OEM_AUTO = 0xF3 + VK_OEM_ENLW = 0xF4 + VK_OEM_BACKTAB = 0xF5 + VK_ATTN = 0xF6 + VK_CRSEL = 0xF7 + VK_EXSEL = 0xF8 + VK_EREOF = 0xF9 + VK_PLAY = 0xFA + VK_ZOOM = 0xFB + VK_NONAME = 0xFC + VK_PA1 = 0xFD + VK_OEM_CLEAR = 0xFE +) + +// Registry Value Types +const ( + REG_NONE = 0 + REG_SZ = 1 + REG_EXPAND_SZ = 2 + REG_BINARY = 3 + REG_DWORD = 4 + REG_DWORD_LITTLE_ENDIAN = 4 + REG_DWORD_BIG_ENDIAN = 5 + REG_LINK = 6 + REG_MULTI_SZ = 7 + REG_RESOURCE_LIST = 8 + REG_FULL_RESOURCE_DESCRIPTOR = 9 + REG_RESOURCE_REQUIREMENTS_LIST = 10 + REG_QWORD = 11 + REG_QWORD_LITTLE_ENDIAN = 11 +) + +// Tooltip styles +const ( + TTS_ALWAYSTIP = 0x01 + TTS_NOPREFIX = 0x02 + TTS_NOANIMATE = 0x10 + TTS_NOFADE = 0x20 + TTS_BALLOON = 0x40 + TTS_CLOSE = 0x80 + TTS_USEVISUALSTYLE = 0x100 +) + +// Tooltip messages +const ( + TTM_ACTIVATE = WM_USER + 1 + TTM_SETDELAYTIME = WM_USER + 3 + TTM_ADDTOOL = WM_USER + 4 + TTM_DELTOOL = WM_USER + 5 + TTM_NEWTOOLRECT = WM_USER + 6 + TTM_RELAYEVENT = WM_USER + 7 + TTM_GETTOOLINFO = WM_USER + 8 + TTM_SETTOOLINFO = WM_USER + 9 + TTM_HITTEST = WM_USER + 10 + TTM_GETTEXT = WM_USER + 11 + TTM_UPDATETIPTEXT = WM_USER + 12 + TTM_GETTOOLCOUNT = WM_USER + 13 + TTM_ENUMTOOLS = WM_USER + 14 + TTM_GETCURRENTTOOL = WM_USER + 15 + TTM_WINDOWFROMPOINT = WM_USER + 16 + TTM_TRACKACTIVATE = WM_USER + 17 + TTM_TRACKPOSITION = WM_USER + 18 + TTM_SETTIPBKCOLOR = WM_USER + 19 + TTM_SETTIPTEXTCOLOR = WM_USER + 20 + TTM_GETDELAYTIME = WM_USER + 21 + TTM_GETTIPBKCOLOR = WM_USER + 22 + TTM_GETTIPTEXTCOLOR = WM_USER + 23 + TTM_SETMAXTIPWIDTH = WM_USER + 24 + TTM_GETMAXTIPWIDTH = WM_USER + 25 + TTM_SETMARGIN = WM_USER + 26 + TTM_GETMARGIN = WM_USER + 27 + TTM_POP = WM_USER + 28 + TTM_UPDATE = WM_USER + 29 + TTM_GETBUBBLESIZE = WM_USER + 30 + TTM_ADJUSTRECT = WM_USER + 31 + TTM_SETTITLE = WM_USER + 32 + TTM_POPUP = WM_USER + 34 + TTM_GETTITLE = WM_USER + 35 +) + +// Tooltip icons +const ( + TTI_NONE = 0 + TTI_INFO = 1 + TTI_WARNING = 2 + TTI_ERROR = 3 + TTI_INFO_LARGE = 4 + TTI_WARNING_LARGE = 5 + TTI_ERROR_LARGE = 6 +) + +// Tooltip notifications +const ( + TTN_FIRST = -520 + TTN_LAST = -549 + TTN_GETDISPINFO = TTN_FIRST + TTN_SHOW = TTN_FIRST - 1 + TTN_POP = TTN_FIRST - 2 + TTN_LINKCLICK = TTN_FIRST - 3 + TTN_NEEDTEXT = TTN_GETDISPINFO +) + +const ( + TTF_IDISHWND = 0x0001 + TTF_CENTERTIP = 0x0002 + TTF_RTLREADING = 0x0004 + TTF_SUBCLASS = 0x0010 + TTF_TRACK = 0x0020 + TTF_ABSOLUTE = 0x0080 + TTF_TRANSPARENT = 0x0100 + TTF_PARSELINKS = 0x1000 + TTF_DI_SETITEM = 0x8000 +) + +const ( + SWP_NOSIZE = 0x0001 + SWP_NOMOVE = 0x0002 + SWP_NOZORDER = 0x0004 + SWP_NOREDRAW = 0x0008 + SWP_NOACTIVATE = 0x0010 + SWP_FRAMECHANGED = 0x0020 + SWP_SHOWWINDOW = 0x0040 + SWP_HIDEWINDOW = 0x0080 + SWP_NOCOPYBITS = 0x0100 + SWP_NOOWNERZORDER = 0x0200 + SWP_NOSENDCHANGING = 0x0400 + SWP_DRAWFRAME = SWP_FRAMECHANGED + SWP_NOREPOSITION = SWP_NOOWNERZORDER + SWP_DEFERERASE = 0x2000 + SWP_ASYNCWINDOWPOS = 0x4000 +) + +// Predefined window handles +const ( + HWND_BROADCAST = HWND(0xFFFF) + HWND_BOTTOM = HWND(1) + HWND_NOTOPMOST = ^HWND(1) // -2 + HWND_TOP = HWND(0) + HWND_TOPMOST = ^HWND(0) // -1 + HWND_DESKTOP = HWND(0) + HWND_MESSAGE = ^HWND(2) // -3 +) + +// Pen types +const ( + PS_COSMETIC = 0x00000000 + PS_GEOMETRIC = 0x00010000 + PS_TYPE_MASK = 0x000F0000 +) + +// Pen styles +const ( + PS_SOLID = 0 + PS_DASH = 1 + PS_DOT = 2 + PS_DASHDOT = 3 + PS_DASHDOTDOT = 4 + PS_NULL = 5 + PS_INSIDEFRAME = 6 + PS_USERSTYLE = 7 + PS_ALTERNATE = 8 + PS_STYLE_MASK = 0x0000000F +) + +// Pen cap types +const ( + PS_ENDCAP_ROUND = 0x00000000 + PS_ENDCAP_SQUARE = 0x00000100 + PS_ENDCAP_FLAT = 0x00000200 + PS_ENDCAP_MASK = 0x00000F00 +) + +// Pen join types +const ( + PS_JOIN_ROUND = 0x00000000 + PS_JOIN_BEVEL = 0x00001000 + PS_JOIN_MITER = 0x00002000 + PS_JOIN_MASK = 0x0000F000 +) + +// Hatch styles +const ( + HS_HORIZONTAL = 0 + HS_VERTICAL = 1 + HS_FDIAGONAL = 2 + HS_BDIAGONAL = 3 + HS_CROSS = 4 + HS_DIAGCROSS = 5 +) + +// Stock Logical Objects +const ( + WHITE_BRUSH = 0 + LTGRAY_BRUSH = 1 + GRAY_BRUSH = 2 + DKGRAY_BRUSH = 3 + BLACK_BRUSH = 4 + NULL_BRUSH = 5 + HOLLOW_BRUSH = NULL_BRUSH + WHITE_PEN = 6 + BLACK_PEN = 7 + NULL_PEN = 8 + OEM_FIXED_FONT = 10 + ANSI_FIXED_FONT = 11 + ANSI_VAR_FONT = 12 + SYSTEM_FONT = 13 + DEVICE_DEFAULT_FONT = 14 + DEFAULT_PALETTE = 15 + SYSTEM_FIXED_FONT = 16 + DEFAULT_GUI_FONT = 17 + DC_BRUSH = 18 + DC_PEN = 19 +) + +// Brush styles +const ( + BS_SOLID = 0 + BS_NULL = 1 + BS_HOLLOW = BS_NULL + BS_HATCHED = 2 + BS_PATTERN = 3 + BS_INDEXED = 4 + BS_DIBPATTERN = 5 + BS_DIBPATTERNPT = 6 + BS_PATTERN8X8 = 7 + BS_DIBPATTERN8X8 = 8 + BS_MONOPATTERN = 9 +) + +// TRACKMOUSEEVENT flags +const ( + TME_HOVER = 0x00000001 + TME_LEAVE = 0x00000002 + TME_NONCLIENT = 0x00000010 + TME_QUERY = 0x40000000 + TME_CANCEL = 0x80000000 + + HOVER_DEFAULT = 0xFFFFFFFF +) + +// WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes +const ( + HTERROR = -2 + HTTRANSPARENT = -1 + HTNOWHERE = 0 + HTCLIENT = 1 + HTCAPTION = 2 + HTSYSMENU = 3 + HTGROWBOX = 4 + HTSIZE = HTGROWBOX + HTMENU = 5 + HTHSCROLL = 6 + HTVSCROLL = 7 + HTMINBUTTON = 8 + HTMAXBUTTON = 9 + HTLEFT = 10 + HTRIGHT = 11 + HTTOP = 12 + HTTOPLEFT = 13 + HTTOPRIGHT = 14 + HTBOTTOM = 15 + HTBOTTOMLEFT = 16 + HTBOTTOMRIGHT = 17 + HTBORDER = 18 + HTREDUCE = HTMINBUTTON + HTZOOM = HTMAXBUTTON + HTSIZEFIRST = HTLEFT + HTSIZELAST = HTBOTTOMRIGHT + HTOBJECT = 19 + HTCLOSE = 20 + HTHELP = 21 +) + +// DrawText[Ex] format flags +const ( + DT_TOP = 0x00000000 + DT_LEFT = 0x00000000 + DT_CENTER = 0x00000001 + DT_RIGHT = 0x00000002 + DT_VCENTER = 0x00000004 + DT_BOTTOM = 0x00000008 + DT_WORDBREAK = 0x00000010 + DT_SINGLELINE = 0x00000020 + DT_EXPANDTABS = 0x00000040 + DT_TABSTOP = 0x00000080 + DT_NOCLIP = 0x00000100 + DT_EXTERNALLEADING = 0x00000200 + DT_CALCRECT = 0x00000400 + DT_NOPREFIX = 0x00000800 + DT_INTERNAL = 0x00001000 + DT_EDITCONTROL = 0x00002000 + DT_PATH_ELLIPSIS = 0x00004000 + DT_END_ELLIPSIS = 0x00008000 + DT_MODIFYSTRING = 0x00010000 + DT_RTLREADING = 0x00020000 + DT_WORD_ELLIPSIS = 0x00040000 + DT_NOFULLWIDTHCHARBREAK = 0x00080000 + DT_HIDEPREFIX = 0x00100000 + DT_PREFIXONLY = 0x00200000 +) + +const CLR_INVALID = 0xFFFFFFFF + +// Background Modes +const ( + TRANSPARENT = 1 + OPAQUE = 2 + BKMODE_LAST = 2 +) + +// Global Memory Flags +const ( + GMEM_FIXED = 0x0000 + GMEM_MOVEABLE = 0x0002 + GMEM_NOCOMPACT = 0x0010 + GMEM_NODISCARD = 0x0020 + GMEM_ZEROINIT = 0x0040 + GMEM_MODIFY = 0x0080 + GMEM_DISCARDABLE = 0x0100 + GMEM_NOT_BANKED = 0x1000 + GMEM_SHARE = 0x2000 + GMEM_DDESHARE = 0x2000 + GMEM_NOTIFY = 0x4000 + GMEM_LOWER = GMEM_NOT_BANKED + GMEM_VALID_FLAGS = 0x7F72 + GMEM_INVALID_HANDLE = 0x8000 + GHND = GMEM_MOVEABLE | GMEM_ZEROINIT + GPTR = GMEM_FIXED | GMEM_ZEROINIT +) + +// Ternary raster operations +const ( + SRCCOPY = 0x00CC0020 + SRCPAINT = 0x00EE0086 + SRCAND = 0x008800C6 + SRCINVERT = 0x00660046 + SRCERASE = 0x00440328 + NOTSRCCOPY = 0x00330008 + NOTSRCERASE = 0x001100A6 + MERGECOPY = 0x00C000CA + MERGEPAINT = 0x00BB0226 + PATCOPY = 0x00F00021 + PATPAINT = 0x00FB0A09 + PATINVERT = 0x005A0049 + DSTINVERT = 0x00550009 + BLACKNESS = 0x00000042 + WHITENESS = 0x00FF0062 + NOMIRRORBITMAP = 0x80000000 + CAPTUREBLT = 0x40000000 +) + +// Clipboard formats +const ( + CF_TEXT = 1 + CF_BITMAP = 2 + CF_METAFILEPICT = 3 + CF_SYLK = 4 + CF_DIF = 5 + CF_TIFF = 6 + CF_OEMTEXT = 7 + CF_DIB = 8 + CF_PALETTE = 9 + CF_PENDATA = 10 + CF_RIFF = 11 + CF_WAVE = 12 + CF_UNICODETEXT = 13 + CF_ENHMETAFILE = 14 + CF_HDROP = 15 + CF_LOCALE = 16 + CF_DIBV5 = 17 + CF_MAX = 18 + CF_OWNERDISPLAY = 0x0080 + CF_DSPTEXT = 0x0081 + CF_DSPBITMAP = 0x0082 + CF_DSPMETAFILEPICT = 0x0083 + CF_DSPENHMETAFILE = 0x008E + CF_PRIVATEFIRST = 0x0200 + CF_PRIVATELAST = 0x02FF + CF_GDIOBJFIRST = 0x0300 + CF_GDIOBJLAST = 0x03FF +) + +// Bitmap compression formats +const ( + BI_RGB = 0 + BI_RLE8 = 1 + BI_RLE4 = 2 + BI_BITFIELDS = 3 + BI_JPEG = 4 + BI_PNG = 5 +) + +// SetDIBitsToDevice fuColorUse +const ( + DIB_PAL_COLORS = 1 + DIB_RGB_COLORS = 0 +) + +// Service Control Manager object specific access types +const ( + SC_MANAGER_CONNECT = 0x0001 + SC_MANAGER_CREATE_SERVICE = 0x0002 + SC_MANAGER_ENUMERATE_SERVICE = 0x0004 + SC_MANAGER_LOCK = 0x0008 + SC_MANAGER_QUERY_LOCK_STATUS = 0x0010 + SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020 + SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG +) + +// Service Types (Bit Mask) +const ( + SERVICE_KERNEL_DRIVER = 0x00000001 + SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 + SERVICE_ADAPTER = 0x00000004 + SERVICE_RECOGNIZER_DRIVER = 0x00000008 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_WIN32_OWN_PROCESS = 0x00000010 + SERVICE_WIN32_SHARE_PROCESS = 0x00000020 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 0x00000100 + SERVICE_TYPE_ALL = 1023 +) + +// Service State -- for CurrentState +const ( + SERVICE_STOPPED = 0x00000001 + SERVICE_START_PENDING = 0x00000002 + SERVICE_STOP_PENDING = 0x00000003 + SERVICE_RUNNING = 0x00000004 + SERVICE_CONTINUE_PENDING = 0x00000005 + SERVICE_PAUSE_PENDING = 0x00000006 + SERVICE_PAUSED = 0x00000007 +) + +// Controls Accepted (Bit Mask) +const ( + SERVICE_ACCEPT_STOP = 0x00000001 + SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002 + SERVICE_ACCEPT_SHUTDOWN = 0x00000004 + SERVICE_ACCEPT_PARAMCHANGE = 0x00000008 + SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020 + SERVICE_ACCEPT_POWEREVENT = 0x00000040 + SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080 + SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100 + SERVICE_ACCEPT_TIMECHANGE = 0x00000200 + SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400 +) + +// Service object specific access type +const ( + SERVICE_QUERY_CONFIG = 0x0001 + SERVICE_CHANGE_CONFIG = 0x0002 + SERVICE_QUERY_STATUS = 0x0004 + SERVICE_ENUMERATE_DEPENDENTS = 0x0008 + SERVICE_START = 0x0010 + SERVICE_STOP = 0x0020 + SERVICE_PAUSE_CONTINUE = 0x0040 + SERVICE_INTERROGATE = 0x0080 + SERVICE_USER_DEFINED_CONTROL = 0x0100 + + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + SERVICE_QUERY_CONFIG | + SERVICE_CHANGE_CONFIG | + SERVICE_QUERY_STATUS | + SERVICE_ENUMERATE_DEPENDENTS | + SERVICE_START | + SERVICE_STOP | + SERVICE_PAUSE_CONTINUE | + SERVICE_INTERROGATE | + SERVICE_USER_DEFINED_CONTROL +) + +// MapVirtualKey maptypes +const ( + MAPVK_VK_TO_CHAR = 2 + MAPVK_VK_TO_VSC = 0 + MAPVK_VSC_TO_VK = 1 + MAPVK_VSC_TO_VK_EX = 3 +) + +// ReadEventLog Flags +const ( + EVENTLOG_SEEK_READ = 0x0002 + EVENTLOG_SEQUENTIAL_READ = 0x0001 + EVENTLOG_FORWARDS_READ = 0x0004 + EVENTLOG_BACKWARDS_READ = 0x0008 +) + +// CreateToolhelp32Snapshot flags +const ( + TH32CS_SNAPHEAPLIST = 0x00000001 + TH32CS_SNAPPROCESS = 0x00000002 + TH32CS_SNAPTHREAD = 0x00000004 + TH32CS_SNAPMODULE = 0x00000008 + TH32CS_SNAPMODULE32 = 0x00000010 + TH32CS_INHERIT = 0x80000000 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD +) + +const ( + MAX_MODULE_NAME32 = 255 + MAX_PATH = 260 +) + +const ( + FOREGROUND_BLUE = 0x0001 + FOREGROUND_GREEN = 0x0002 + FOREGROUND_RED = 0x0004 + FOREGROUND_INTENSITY = 0x0008 + BACKGROUND_BLUE = 0x0010 + BACKGROUND_GREEN = 0x0020 + BACKGROUND_RED = 0x0040 + BACKGROUND_INTENSITY = 0x0080 + COMMON_LVB_LEADING_BYTE = 0x0100 + COMMON_LVB_TRAILING_BYTE = 0x0200 + COMMON_LVB_GRID_HORIZONTAL = 0x0400 + COMMON_LVB_GRID_LVERTICAL = 0x0800 + COMMON_LVB_GRID_RVERTICAL = 0x1000 + COMMON_LVB_REVERSE_VIDEO = 0x4000 + COMMON_LVB_UNDERSCORE = 0x8000 +) + +// Flags used by the DWM_BLURBEHIND structure to indicate +// which of its members contain valid information. +const ( + DWM_BB_ENABLE = 0x00000001 // A value for the fEnable member has been specified. + DWM_BB_BLURREGION = 0x00000002 // A value for the hRgnBlur member has been specified. + DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004 // A value for the fTransitionOnMaximized member has been specified. +) + +// Flags used by the DwmEnableComposition function +// to change the state of Desktop Window Manager (DWM) composition. +const ( + DWM_EC_DISABLECOMPOSITION = 0 // Disable composition + DWM_EC_ENABLECOMPOSITION = 1 // Enable composition +) + +// enum-lite implementation for the following constant structure +type DWM_SHOWCONTACT int32 + +const ( + DWMSC_DOWN = 0x00000001 + DWMSC_UP = 0x00000002 + DWMSC_DRAG = 0x00000004 + DWMSC_HOLD = 0x00000008 + DWMSC_PENBARREL = 0x00000010 + DWMSC_NONE = 0x00000000 + DWMSC_ALL = 0xFFFFFFFF +) + +// enum-lite implementation for the following constant structure +type DWM_SOURCE_FRAME_SAMPLING int32 + +// Flags used by the DwmSetPresentParameters function to specify the frame +// sampling type +const ( + DWM_SOURCE_FRAME_SAMPLING_POINT = 0 + DWM_SOURCE_FRAME_SAMPLING_COVERAGE = 1 + DWM_SOURCE_FRAME_SAMPLING_LAST = 2 +) + +// Flags used by the DWM_THUMBNAIL_PROPERTIES structure to +// indicate which of its members contain valid information. +const ( + DWM_TNP_RECTDESTINATION = 0x00000001 // A value for the rcDestination member has been specified + DWM_TNP_RECTSOURCE = 0x00000002 // A value for the rcSource member has been specified + DWM_TNP_OPACITY = 0x00000004 // A value for the opacity member has been specified + DWM_TNP_VISIBLE = 0x00000008 // A value for the fVisible member has been specified + DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010 // A value for the fSourceClientAreaOnly member has been specified +) + +// enum-lite implementation for the following constant structure +type DWMFLIP3DWINDOWPOLICY int32 + +// Flags used by the DwmSetWindowAttribute function to specify the Flip3D window +// policy +const ( + DWMFLIP3D_DEFAULT = 0 + DWMFLIP3D_EXCLUDEBELOW = 1 + DWMFLIP3D_EXCLUDEABOVE = 2 + DWMFLIP3D_LAST = 3 +) + +// enum-lite implementation for the following constant structure +type DWMNCRENDERINGPOLICY int32 + +// Flags used by the DwmSetWindowAttribute function to specify the non-client +// area rendering policy +const ( + DWMNCRP_USEWINDOWSTYLE = 0 + DWMNCRP_DISABLED = 1 + DWMNCRP_ENABLED = 2 + DWMNCRP_LAST = 3 +) + +// enum-lite implementation for the following constant structure +type DWMTRANSITION_OWNEDWINDOW_TARGET int32 + +const ( + DWMTRANSITION_OWNEDWINDOW_NULL = -1 + DWMTRANSITION_OWNEDWINDOW_REPOSITION = 0 +) + +// enum-lite implementation for the following constant structure +type DWMWINDOWATTRIBUTE int32 + +// Flags used by the DwmGetWindowAttribute and DwmSetWindowAttribute functions +// to specify window attributes for non-client rendering +const ( + DWMWA_NCRENDERING_ENABLED = 1 + DWMWA_NCRENDERING_POLICY = 2 + DWMWA_TRANSITIONS_FORCEDISABLED = 3 + DWMWA_ALLOW_NCPAINT = 4 + DWMWA_CAPTION_BUTTON_BOUNDS = 5 + DWMWA_NONCLIENT_RTL_LAYOUT = 6 + DWMWA_FORCE_ICONIC_REPRESENTATION = 7 + DWMWA_FLIP3D_POLICY = 8 + DWMWA_EXTENDED_FRAME_BOUNDS = 9 + DWMWA_HAS_ICONIC_BITMAP = 10 + DWMWA_DISALLOW_PEEK = 11 + DWMWA_EXCLUDED_FROM_PEEK = 12 + DWMWA_CLOAK = 13 + DWMWA_CLOAKED = 14 + DWMWA_FREEZE_REPRESENTATION = 15 + DWMWA_LAST = 16 +) + +const ( + DWM_CLOAKED_APP = 1 + DWM_CLOAKED_SHELL = 2 + DWM_CLOAKED_INHERITED = 4 +) + +// enum-lite implementation for the following constant structure +type GESTURE_TYPE int32 + +// Identifies the gesture type +const ( + GT_PEN_TAP = 0 + GT_PEN_DOUBLETAP = 1 + GT_PEN_RIGHTTAP = 2 + GT_PEN_PRESSANDHOLD = 3 + GT_PEN_PRESSANDHOLDABORT = 4 + GT_TOUCH_TAP = 5 + GT_TOUCH_DOUBLETAP = 6 + GT_TOUCH_RIGHTTAP = 7 + GT_TOUCH_PRESSANDHOLD = 8 + GT_TOUCH_PRESSANDHOLDABORT = 9 + GT_TOUCH_PRESSANDTAP = 10 +) + +// Icons +const ( + ICON_SMALL = 0 + ICON_BIG = 1 + ICON_SMALL2 = 2 +) + +const ( + SIZE_RESTORED = 0 + SIZE_MINIMIZED = 1 + SIZE_MAXIMIZED = 2 + SIZE_MAXSHOW = 3 + SIZE_MAXHIDE = 4 +) + +// XButton values +const ( + XBUTTON1 = 1 + XBUTTON2 = 2 +) + +// Devmode +const ( + DM_SPECVERSION = 0x0401 + + DM_ORIENTATION = 0x00000001 + DM_PAPERSIZE = 0x00000002 + DM_PAPERLENGTH = 0x00000004 + DM_PAPERWIDTH = 0x00000008 + DM_SCALE = 0x00000010 + DM_POSITION = 0x00000020 + DM_NUP = 0x00000040 + DM_DISPLAYORIENTATION = 0x00000080 + DM_COPIES = 0x00000100 + DM_DEFAULTSOURCE = 0x00000200 + DM_PRINTQUALITY = 0x00000400 + DM_COLOR = 0x00000800 + DM_DUPLEX = 0x00001000 + DM_YRESOLUTION = 0x00002000 + DM_TTOPTION = 0x00004000 + DM_COLLATE = 0x00008000 + DM_FORMNAME = 0x00010000 + DM_LOGPIXELS = 0x00020000 + DM_BITSPERPEL = 0x00040000 + DM_PELSWIDTH = 0x00080000 + DM_PELSHEIGHT = 0x00100000 + DM_DISPLAYFLAGS = 0x00200000 + DM_DISPLAYFREQUENCY = 0x00400000 + DM_ICMMETHOD = 0x00800000 + DM_ICMINTENT = 0x01000000 + DM_MEDIATYPE = 0x02000000 + DM_DITHERTYPE = 0x04000000 + DM_PANNINGWIDTH = 0x08000000 + DM_PANNINGHEIGHT = 0x10000000 + DM_DISPLAYFIXEDOUTPUT = 0x20000000 +) + +// ChangeDisplaySettings +const ( + CDS_UPDATEREGISTRY = 0x00000001 + CDS_TEST = 0x00000002 + CDS_FULLSCREEN = 0x00000004 + CDS_GLOBAL = 0x00000008 + CDS_SET_PRIMARY = 0x00000010 + CDS_VIDEOPARAMETERS = 0x00000020 + CDS_RESET = 0x40000000 + CDS_NORESET = 0x10000000 + + DISP_CHANGE_SUCCESSFUL = 0 + DISP_CHANGE_RESTART = 1 + DISP_CHANGE_FAILED = -1 + DISP_CHANGE_BADMODE = -2 + DISP_CHANGE_NOTUPDATED = -3 + DISP_CHANGE_BADFLAGS = -4 + DISP_CHANGE_BADPARAM = -5 + DISP_CHANGE_BADDUALVIEW = -6 +) + +const ( + ENUM_CURRENT_SETTINGS = 0xFFFFFFFF + ENUM_REGISTRY_SETTINGS = 0xFFFFFFFE +) + +// PIXELFORMATDESCRIPTOR +const ( + PFD_TYPE_RGBA = 0 + PFD_TYPE_COLORINDEX = 1 + + PFD_MAIN_PLANE = 0 + PFD_OVERLAY_PLANE = 1 + PFD_UNDERLAY_PLANE = -1 + + PFD_DOUBLEBUFFER = 0x00000001 + PFD_STEREO = 0x00000002 + PFD_DRAW_TO_WINDOW = 0x00000004 + PFD_DRAW_TO_BITMAP = 0x00000008 + PFD_SUPPORT_GDI = 0x00000010 + PFD_SUPPORT_OPENGL = 0x00000020 + PFD_GENERIC_FORMAT = 0x00000040 + PFD_NEED_PALETTE = 0x00000080 + PFD_NEED_SYSTEM_PALETTE = 0x00000100 + PFD_SWAP_EXCHANGE = 0x00000200 + PFD_SWAP_COPY = 0x00000400 + PFD_SWAP_LAYER_BUFFERS = 0x00000800 + PFD_GENERIC_ACCELERATED = 0x00001000 + PFD_SUPPORT_DIRECTDRAW = 0x00002000 + PFD_DIRECT3D_ACCELERATED = 0x00004000 + PFD_SUPPORT_COMPOSITION = 0x00008000 + + PFD_DEPTH_DONTCARE = 0x20000000 + PFD_DOUBLEBUFFER_DONTCARE = 0x40000000 + PFD_STEREO_DONTCARE = 0x80000000 +) + +const ( + INPUT_MOUSE = 0 + INPUT_KEYBOARD = 1 + INPUT_HARDWARE = 2 +) + +const ( + MOUSEEVENTF_ABSOLUTE = 0x8000 + MOUSEEVENTF_HWHEEL = 0x01000 + MOUSEEVENTF_MOVE = 0x0001 + MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000 + MOUSEEVENTF_LEFTDOWN = 0x0002 + MOUSEEVENTF_LEFTUP = 0x0004 + MOUSEEVENTF_RIGHTDOWN = 0x0008 + MOUSEEVENTF_RIGHTUP = 0x0010 + MOUSEEVENTF_MIDDLEDOWN = 0x0020 + MOUSEEVENTF_MIDDLEUP = 0x0040 + MOUSEEVENTF_VIRTUALDESK = 0x4000 + MOUSEEVENTF_WHEEL = 0x0800 + MOUSEEVENTF_XDOWN = 0x0080 + MOUSEEVENTF_XUP = 0x0100 +) + +const ( + KEYEVENTF_EXTENDEDKEY = 0x0001 + KEYEVENTF_KEYUP = 0x0002 + KEYEVENTF_SCANCODE = 0x0008 + KEYEVENTF_UNICODE = 0x0004 +) + +// Windows Hooks (WH_*) +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx +const ( + WH_CALLWNDPROC = 4 + WH_CALLWNDPROCRET = 12 + WH_CBT = 5 + WH_DEBUG = 9 + WH_FOREGROUNDIDLE = 11 + WH_GETMESSAGE = 3 + WH_JOURNALPLAYBACK = 1 + WH_JOURNALRECORD = 0 + WH_KEYBOARD = 2 + WH_KEYBOARD_LL = 13 + WH_MOUSE = 7 + WH_MOUSE_LL = 14 + WH_MSGFILTER = -1 + WH_SHELL = 10 + WH_SYSMSGFILTER = 6 +) + +// Process Security and Access Rights +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx +const ( + PROCESS_TERMINATE = 0x0001 + PROCESS_CREATE_THREAD = 0x0002 + PROCESS_SET_SESSIONID = 0x0004 + PROCESS_VM_OPERATION = 0x0008 + PROCESS_VM_READ = 0x0010 + PROCESS_VM_WRITE = 0x0020 + PROCESS_DUP_HANDLE = 0x0040 + PROCESS_CREATE_PROCESS = 0x0080 + PROCESS_SET_QUOTA = 0x0100 + PROCESS_SET_INFORMATION = 0x0200 + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_SUSPEND_RESUME = 0x0800 + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + PROCESS_SET_LIMITED_INFORMATION = 0x2000 +) + +const ( + IMAGE_BITMAP = 0 + IMAGE_ICON = 1 + IMAGE_CURSOR = 2 +) + +const ( + LR_DEFAULTCOLOR = 0x0000 + LR_MONOCHROME = 0x0001 + LR_COLOR = 0x0002 + LR_COPYRETURNORG = 0x0004 + LR_COPYDELETEORG = 0x0008 + LR_LOADFROMFILE = 0x0010 + LR_LOADTRANSPARENT = 0x0020 + LR_DEFAULTSIZE = 0x0040 + LR_VGACOLOR = 0x0080 + LR_LOADMAP3DCOLORS = 0x1000 + LR_CREATEDIBSECTION = 0x2000 + LR_COPYFROMRESOURCE = 0x4000 + LR_SHARED = 0x8000 +) + +const ( + MF_BITMAP = 0x0004 + MF_CHECKED = 0x0008 + MF_DISABLED = 0x0002 + MF_ENABLED = 0x0000 + MF_GRAYED = 0x0001 + MF_MENUBARBREAK = 0x0020 + MF_MENUBREAK = 0x0040 + MF_OWNERDRAW = 0x0100 + MF_POPUP = 0x0010 + MF_SEPARATOR = 0x0800 + MF_STRING = 0x0000 + MF_UNCHECKED = 0x0000 + MF_BYCOMMAND = 0x0000 + MF_BYPOSITION = 0x0400 +) + +const ( + RID_INPUT = 0x10000003 + RID_HEADER = 0x10000005 +) + +const ( + RIM_TYPEMOUSE = 0 + RIM_TYPEKEYBOARD = 1 + RIM_TYPEHID = 2 +) + +const ( + RI_KEY_MAKE = 0 // key is down + RI_KEY_BREAK = 1 // key is up + RI_KEY_E0 = 2 // scan code has e0 prefix + RI_KEY_E1 = 4 // scan code has e1 prefix + RI_KEY_TERMSRV_SET_LED = 8 + RI_KEY_TERMSRV_SHADOW = 0x10 +) + +const ( + MOUSE_MOVE_RELATIVE = 0 + MOUSE_MOVE_ABSOLUTE = 1 + MOUSE_VIRTUAL_DESKTOP = 0x02 + MOUSE_ATTRIBUTES_CHANGED = 0x04 + MOUSE_MOVE_NOCOALESCE = 0x08 +) + +const ( + RI_MOUSE_LEFT_BUTTON_DOWN = 0x0001 + RI_MOUSE_LEFT_BUTTON_UP = 0x0002 + RI_MOUSE_RIGHT_BUTTON_DOWN = 0x0004 + RI_MOUSE_RIGHT_BUTTON_UP = 0x0008 + RI_MOUSE_MIDDLE_BUTTON_DOWN = 0x0010 + RI_MOUSE_MIDDLE_BUTTON_UP = 0x0020 + RI_MOUSE_BUTTON_1_DOWN = RI_MOUSE_LEFT_BUTTON_DOWN + RI_MOUSE_BUTTON_1_UP = RI_MOUSE_LEFT_BUTTON_UP + RI_MOUSE_BUTTON_2_DOWN = RI_MOUSE_RIGHT_BUTTON_DOWN + RI_MOUSE_BUTTON_2_UP = RI_MOUSE_RIGHT_BUTTON_UP + RI_MOUSE_BUTTON_3_DOWN = RI_MOUSE_MIDDLE_BUTTON_DOWN + RI_MOUSE_BUTTON_3_UP = RI_MOUSE_MIDDLE_BUTTON_UP + RI_MOUSE_BUTTON_4_DOWN = 0x0040 // XBUTTON1 changed to down + RI_MOUSE_BUTTON_4_UP = 0x0080 // XBUTTON1 changed to up + RI_MOUSE_BUTTON_5_DOWN = 0x100 // XBUTTON2 changed to down + RI_MOUSE_BUTTON_5_UP = 0x0200 // XBUTTON2 changed to up + RI_MOUSE_WHEEL = 0x0400 +) + +const ( + RIDEV_REMOVE = 0x00000001 + RIDEV_EXCLUDE = 0x00000010 + RIDEV_PAGEONLY = 0x00000020 + RIDEV_NOLEGACY = 0x00000030 + RIDEV_INPUTSINK = 0x00000100 + RIDEV_CAPTUREMOUSE = 0x00000200 + RIDEV_NOHOTKEYS = 0x00000200 + RIDEV_APPKEYS = 0x00000400 + RIDEV_EXINPUTSINK = 0x00001000 + RIDEV_DEVNOTIFY = 0x00002000 +) + +// GDI+ constants +const ( + Ok = 0 + GenericError = 1 + InvalidParameter = 2 + OutOfMemory = 3 + ObjectBusy = 4 + InsufficientBuffer = 5 + NotImplemented = 6 + Win32Error = 7 + WrongState = 8 + Aborted = 9 + FileNotFound = 10 + ValueOverflow = 11 + AccessDenied = 12 + UnknownImageFormat = 13 + FontFamilyNotFound = 14 + FontStyleNotFound = 15 + NotTrueTypeFont = 16 + UnsupportedGdiplusVersion = 17 + GdiplusNotInitialized = 18 + PropertyNotFound = 19 + PropertyNotSupported = 20 + ProfileNotFound = 21 +) + +var ( + IID_NULL = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}} + IID_IUnknown = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}} + IID_IDispatch = &GUID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}} + IID_IConnectionPointContainer = &GUID{0xB196B284, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}} + IID_IConnectionPoint = &GUID{0xB196B286, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}} +) + +const ( + VS_FF_DEBUG = 0x00000001 + VS_FF_INFOINFERRED = 0x00000010 + VS_FF_PATCHED = 0x00000004 + VS_FF_PRERELEASE = 0x00000002 + VS_FF_PRIVATEBUILD = 0x00000008 + VS_FF_SPECIALBUILD = 0x00000020 + + VOS_DOS = 0x00010000 + VOS_NT = 0x00040000 + VOS__WINDOWS16 = 0x00000001 + VOS__WINDOWS32 = 0x00000004 + VOS_OS216 = 0x00020000 + VOS_OS232 = 0x00030000 + VOS__PM16 = 0x00000002 + VOS__PM32 = 0x00000003 + VOS_UNKNOWN = 0x00000000 + + VOS_DOS_WINDOWS16 = 0x00010001 + VOS_DOS_WINDOWS32 = 0x00010004 + VOS_NT_WINDOWS32 = 0x00040004 + VOS_OS216_PM16 = 0x00020002 + VOS_OS232_PM32 = 0x00030003 + + VFT_APP = 0x00000001 + VFT_DLL = 0x00000002 + VFT_DRV = 0x00000003 + VFT_FONT = 0x00000004 + VFT_STATIC_LIB = 0x00000007 + VFT_UNKNOWN = 0x00000000 + VFT_VXD = 0x00000005 + + VFT2_DRV_COMM = 0x0000000A + VFT2_DRV_DISPLAY = 0x00000004 + VFT2_DRV_INSTALLABLE = 0x00000008 + VFT2_DRV_KEYBOARD = 0x00000002 + VFT2_DRV_LANGUAGE = 0x00000003 + VFT2_DRV_MOUSE = 0x00000005 + VFT2_DRV_NETWORK = 0x00000006 + VFT2_DRV_PRINTER = 0x00000001 + VFT2_DRV_SOUND = 0x00000009 + VFT2_DRV_SYSTEM = 0x00000007 + VFT2_DRV_VERSIONED_PRINTER = 0x0000000C + VFT2_UNKNOWN = 0x00000000 + + VFT2_FONT_RASTER = 0x00000001 + VFT2_FONT_TRUETYPE = 0x00000003 + VFT2_FONT_VECTOR = 0x00000002 +) + +const ( + SND_SYNC = 0 + SND_ASYNC = 1 + SND_NODEFAULT = 2 + SND_MEMORY = 4 + SND_LOOP = 8 + SND_NOSTOP = 16 + SND_NOWAIT = 0x2000 + SND_ALIAS = 0x10000 + SND_ALIAS_ID = 0x110000 + SND_FILENAME = 0x20000 + SND_RESOURCE = 0x40004 + SND_PURGE = 0x40 + SND_APPLICATION = 0x80 + SND_ALIAS_START = 0 +) + +const ( + BLACKONWHITE = 1 + WHITEONBLACK = 2 + COLORONCOLOR = 3 + HALFTONE = 4 + STRETCH_ANDSCANS = BLACKONWHITE + STRETCH_DELETESCANS = COLORONCOLOR + STRETCH_HALFTONE = HALFTONE + STRETCH_ORSCANS = WHITEONBLACK +) + +const ( + GW_HWNDFIRST = 0 + GW_HWNDLAST = 1 + GW_HWNDNEXT = 2 + GW_HWNDPREV = 3 + GW_OWNER = 4 + GW_CHILD = 5 + GW_ENABLEDPOPUP = 6 +) + +// ACCEL behavior flags +const ( + FVIRTKEY = 0x01 + FNOINVERT = 0x02 + FSHIFT = 0x04 + FCONTROL = 0x08 + FALT = 0x10 +) + +// Mouse key flags +const ( + MK_LBUTTON = 0x0001 + MK_RBUTTON = 0x0002 + MK_SHIFT = 0x0004 + MK_CONTROL = 0x0008 + MK_MBUTTON = 0x0010 + MK_XBUTTON1 = 0x0020 + MK_XBUTTON2 = 0x0040 +) + +const UPDOWN_CLASS = "msctls_updown32" + +const ( + UDS_WRAP = 1 + UDS_SETBUDDYINT = 2 + UDS_ALIGNRIGHT = 4 + UDS_ALIGNLEFT = 8 + UDS_AUTOBUDDY = 16 + UDS_ARROWKEYS = 32 + UDS_HORZ = 64 + UDS_NOTHOUSANDS = 128 +) + +const ( + UDN_FIRST = 4294966575 + UDN_LAST = 4294966567 + UDN_DELTAPOS = UDN_FIRST - 1 +) + +const ( + UDM_SETRANGE = WM_USER + 101 + UDM_GETRANGE = WM_USER + 102 + UDM_SETPOS = WM_USER + 103 + UDM_GETPOS = WM_USER + 104 + UDM_SETBUDDY = WM_USER + 105 + UDM_GETBUDDY = WM_USER + 106 + UDM_SETACCEL = WM_USER + 107 + UDM_GETACCEL = WM_USER + 108 + UDM_SETBASE = WM_USER + 109 + UDM_GETBASE = WM_USER + 110 + UDM_SETRANGE32 = WM_USER + 111 + UDM_GETRANGE32 = WM_USER + 112 + UDM_SETPOS32 = WM_USER + 113 + UDM_GETPOS32 = WM_USER + 114 + UDM_SETUNICODEFORMAT = 0x2005 + UDM_GETUNICODEFORMAT = 0x2006 +) + +const ( + GCL_CBCLSEXTRA = -20 + GCL_CBWNDEXTRA = -18 + GCLP_HBRBACKGROUND = -10 + GCLP_HCURSOR = -12 + GCLP_HICON = -14 + GCLP_HICONSM = -34 + GCLP_HMODULE = -16 + GCLP_MENUNAME = -8 + GCL_STYLE = -26 + GCLP_WNDPROC = -24 +) + +// system commands +const ( + SC_CLOSE = 0xF060 + SC_CONTEXTHELP = 0xF180 + SC_DEFAULT = 0xF160 + SC_HOTKEY = 0xF150 + SC_HSCROLL = 0xF080 + SCF_ISSECURE = 0x0001 + SC_KEYMENU = 0xF100 + SC_MAXIMIZE = 0xF030 + SC_MINIMIZE = 0xF020 + SC_MONITORPOWER = 0xF170 + SC_MOUSEMENU = 0xF090 + SC_MOVE = 0xF010 + SC_NEXTWINDOW = 0xF040 + SC_PREVWINDOW = 0xF050 + SC_RESTORE = 0xF120 + SC_SCREENSAVE = 0xF140 + SC_SIZE = 0xF000 + SC_TASKLIST = 0xF130 + SC_VSCROLL = 0xF070 +) + +const AC_SRC_OVER = 0 + +const AC_SRC_ALPHA = 1 + +const ( + RESOURCE_CONNECTED = 0x00000001 + RESOURCE_GLOBALNET = 0x00000002 + RESOURCE_REMEMBERED = 0x00000003 + RESOURCE_RECENT = 0x00000004 + RESOURCE_CONTEXT = 0x00000005 +) + +const ( + RESOURCETYPE_ANY = 0x00000000 + RESOURCETYPE_DISK = 0x00000001 + RESOURCETYPE_PRINT = 0x00000002 + RESOURCETYPE_RESERVED = 0x00000008 + RESOURCETYPE_UNKNOWN = 0xFFFFFFFF +) + +const ( + RESOURCEUSAGE_CONNECTABLE = 0x00000001 + RESOURCEUSAGE_CONTAINER = 0x00000002 + RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004 + RESOURCEUSAGE_SIBLING = 0x00000008 + RESOURCEUSAGE_ATTACHED = 0x00000010 + RESOURCEUSAGE_ALL = RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED + RESOURCEUSAGE_RESERVED = 0x80000000 +) + +const ( + RESOURCEDISPLAYTYPE_GENERIC = 0x00000000 + RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001 + RESOURCEDISPLAYTYPE_SERVER = 0x00000002 + RESOURCEDISPLAYTYPE_SHARE = 0x00000003 + RESOURCEDISPLAYTYPE_FILE = 0x00000004 + RESOURCEDISPLAYTYPE_GROUP = 0x00000005 + RESOURCEDISPLAYTYPE_NETWORK = 0x00000006 + RESOURCEDISPLAYTYPE_ROOT = 0x00000007 + RESOURCEDISPLAYTYPE_SHAREADMIN = 0x00000008 + RESOURCEDISPLAYTYPE_DIRECTORY = 0x00000009 + RESOURCEDISPLAYTYPE_TREE = 0x0000000A + RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000B +) + +const NETPROPERTY_PERSISTENT = 1 + +const ( + CONNECT_UPDATE_PROFILE = 0x00000001 + CONNECT_UPDATE_RECENT = 0x00000002 + CONNECT_TEMPORARY = 0x00000004 + CONNECT_INTERACTIVE = 0x00000008 + CONNECT_PROMPT = 0x00000010 + CONNECT_NEED_DRIVE = 0x00000020 + CONNECT_REFCOUNT = 0x00000040 + CONNECT_REDIRECT = 0x00000080 + CONNECT_LOCALDRIVE = 0x00000100 + CONNECT_CURRENT_MEDIA = 0x00000200 + CONNECT_DEFERRED = 0x00000400 + CONNECT_RESERVED = 0xFF000000 + CONNECT_COMMANDLINE = 0x00000800 + CONNECT_CMD_SAVECRED = 0x00001000 +) + +const PW_CLIENTONLY = 1 + +const ( + SEM_FAILCRITICALERRORS = 0x0001 + SEM_NOALIGNMENTFAULTEXCEPT = 0x0004 + SEM_NOGPFAULTERRORBOX = 0x0002 + SEM_NOOPENFILEERRORBOX = 0x8000 +) + +const ( + GENERIC_ALL = 0x10000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_WRITE = 0x40000000 + GENERIC_READ = 0x80000000 +) + +const SYNCHRONIZE = 0x100000 + +const ( + STANDARD_RIGHTS_REQUIRED = 0xF0000 + STANDARD_RIGHTS_READ = 0x20000 + STANDARD_RIGHTS_WRITE = 0x20000 + STANDARD_RIGHTS_EXECUTE = 0x20000 + STANDARD_RIGHTS_ALL = 0x1F0000 + SPECIFIC_RIGHTS_ALL = 0xFFFF + ACCESS_SYSTEM_SECURITY = 0x1000000 +) + +const ( + FILE_READ_DATA = 1 + FILE_LIST_DIRECTORY = 1 + FILE_WRITE_DATA = 2 + FILE_ADD_FILE = 2 + FILE_APPEND_DATA = 4 + FILE_ADD_SUBDIRECTORY = 4 + FILE_CREATE_PIPE_INSTANCE = 4 + FILE_READ_EA = 8 + FILE_READ_PROPERTIES = 8 + FILE_WRITE_EA = 16 + FILE_WRITE_PROPERTIES = 16 + FILE_EXECUTE = 32 + FILE_TRAVERSE = 32 + FILE_DELETE_CHILD = 64 + FILE_READ_ATTRIBUTES = 128 + FILE_WRITE_ATTRIBUTES = 256 + FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF + FILE_GENERIC_READ = STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE + FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE + FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE + FILE_SHARE_READ = 1 + FILE_SHARE_WRITE = 2 + FILE_SHARE_DELETE = 4 + FILE_ATTRIBUTE_READONLY = 1 + FILE_ATTRIBUTE_HIDDEN = 2 + FILE_ATTRIBUTE_SYSTEM = 4 + FILE_ATTRIBUTE_DIRECTORY = 16 + FILE_ATTRIBUTE_ARCHIVE = 32 + FILE_ATTRIBUTE_ENCRYPTED = 16384 + FILE_ATTRIBUTE_NORMAL = 128 + FILE_ATTRIBUTE_TEMPORARY = 256 + FILE_ATTRIBUTE_SPARSE_FILE = 512 + FILE_ATTRIBUTE_REPARSE_POINT = 1024 + FILE_ATTRIBUTE_COMPRESSED = 2048 + FILE_ATTRIBUTE_OFFLINE = 0x1000 + FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000 + FILE_NOTIFY_CHANGE_FILE_NAME = 1 + FILE_NOTIFY_CHANGE_DIR_NAME = 2 + FILE_NOTIFY_CHANGE_ATTRIBUTES = 4 + FILE_NOTIFY_CHANGE_SIZE = 8 + FILE_NOTIFY_CHANGE_LAST_WRITE = 16 + FILE_NOTIFY_CHANGE_LAST_ACCESS = 32 + FILE_NOTIFY_CHANGE_CREATION = 64 + FILE_NOTIFY_CHANGE_SECURITY = 256 + FILE_CASE_SENSITIVE_SEARCH = 1 + FILE_CASE_PRESERVED_NAMES = 2 + FILE_UNICODE_ON_DISK = 4 + FILE_PERSISTENT_ACLS = 8 + FILE_FILE_COMPRESSION = 16 + FILE_VOLUME_QUOTAS = 32 + FILE_SUPPORTS_SPARSE_FILES = 64 + FILE_SUPPORTS_REPARSE_POINTS = 128 +) + +const ( + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 +) + +const ( + SECURITY_CONTEXT_TRACKING = 0x00040000 + SECURITY_EFFECTIVE_ONLY = 0x00080000 + SECURITY_SQOS_PRESENT = 0x00100000 + SECURITY_VALID_SQOS_FLAGS = 0x001F0000 +) + +const INVALID_HANDLE_VALUE = ^HANDLE(0) + +// STORAGE_BUS_TYPE values +const ( + BusTypeUnknown = 0 + BusTypeScsi = 1 + BusTypeAtapi = 2 + BusTypeAta = 3 + BusType1394 = 4 + BusTypeSsa = 5 + BusTypeFibre = 6 + BusTypeUsb = 7 + BusTypeRAID = 8 + BusTypeiScsi = 9 + BusTypeSas = 10 + BusTypeSata = 11 + BusTypeSd = 12 + BusTypeMmc = 13 + BusTypeVirtual = 14 + BusTypeFileBackedVirtual = 15 + BusTypeSpaces = 16 + BusTypeNvme = 17 + BusTypeMax = 20 + BusTypeMaxReserved = 0x7F +) + +// STORAGE_QUERY_TYPE values +const ( + PropertyStandardQuery = 0 + PropertyExistsQuery = 1 + PropertyMaskQuery = 2 + PropertyQueryMaxDefined = 3 +) + +// STORAGE_PROPERTY_ID values +const ( + StorageDeviceProperty = 0 + StorageAdapterProperty = 1 + StorageDeviceIdProperty = 2 + StorageDeviceUniqueIdProperty = 3 + StorageDeviceWriteCacheProperty = 4 + StorageMiniportProperty = 5 + StorageAccessAlignmentProperty = 6 + StorageDeviceSeekPenaltyProperty = 7 + StorageDeviceTrimProperty = 8 + StorageDeviceWriteAggregationProperty = 9 + StorageDeviceDeviceTelemetryProperty = 10 + StorageDeviceLBProvisioningProperty = 11 + StorageDevicePowerProperty = 12 + StorageDeviceCopyOffloadProperty = 13 + StorageDeviceResiliencyProperty = 14 + StorageDeviceMediumProductType = 15 +) + +// STREAM_INFO_LEVELS +const ( + FindStreamInfoStandard = 0 +) + +const ( + MIIM_STATE = 1 + MIIM_ID = 2 + MIIM_SUBMENU = 4 + MIIM_CHECKMARKS = 8 + MIIM_TYPE = 16 + MIIM_DATA = 32 + MIIM_STRING = 64 + MIIM_BITMAP = 128 + MIIM_FTYPE = 256 +) + +const ( + MFT_BITMAP = 4 + MFT_MENUBARBREAK = 32 + MFT_MENUBREAK = 64 + MFT_OWNERDRAW = 256 + MFT_RADIOCHECK = 512 + MFT_RIGHTJUSTIFY = 0x4000 + MFT_SEPARATOR = 0x800 + MFT_RIGHTORDER = 0x2000 + MFT_STRING = 0 +) + +const ( + MFS_CHECKED = 8 + MFS_DEFAULT = 4096 + MFS_DISABLED = 3 + MFS_ENABLED = 0 + MFS_GRAYED = 3 + MFS_HILITE = 128 + MFS_UNCHECKED = 0 + MFS_UNHILITE = 0 +) + +const ( + // DEVICE_NOTIFY_WINDOW_HANDLE + // Notifications are sent using WM_POWERBROADCAST messages with a wParam + // parameter of PBT_POWERSETTINGCHANGE. + DEVICE_NOTIFY_WINDOW_HANDLE = 0 + + // DEVICE_NOTIFY_SERVICE_HANDLE + // Notifications are sent to the HandlerEx callback function with a + // dwControl parameter of SERVICE_CONTROL_POWEREVENT and a dwEventType of + // PBT_POWERSETTINGCHANGE. + DEVICE_NOTIFY_SERVICE_HANDLE = 1 +) + +// Power setting GUIDs identify power change events. This topic lists power +// setting GUIDs for notifications that are most useful to applications. An +// application should register for each power change event that might impact its +// behavior. Notification is sent each time a setting changes, through +// WM_POWERBROADCAST. +var ( + // GUID_ACDC_POWER_SOURCE + // + // The system power source has changed. The Data member is a uint32 with + // values from the SYSTEM_POWER_CONDITION enumeration that indicates the + // current power source. + // + // PoAc (0) - The computer is powered by an AC power source (or similar, + // such as a laptop powered by a 12V automotive adapter). + // + // PoDc (1) - The computer is powered by an onboard battery power source. + // + // PoHot (2) - The computer is powered by a short-term power source such as + // a UPS device. + GUID_ACDC_POWER_SOURCE = &GUID{0x5d3e9a59, 0xe9D5, 0x4b00, [8]byte{0xa6, 0xbd, 0xff, 0x34, 0xff, 0x51, 0x65, 0x48}} + + // GUID_BATTERY_PERCENTAGE_REMAINING + // + // The remaining battery capacity has changed. The granularity varies from + // system to system but the finest granularity is 1 percent. The Data member + // is a uint32 that indicates the current battery capacity remaining as a + // percentage from 0 through 100. + GUID_BATTERY_PERCENTAGE_REMAINING = &GUID{0xa7ad8041, 0xb45a, 0x4cae, [8]byte{0x87, 0xa3, 0xee, 0xcb, 0xb4, 0x68, 0xa9, 0xe1}} + + // GUID_CONSOLE_DISPLAY_STATE + // + // The current monitor's display state has changed. + // + // Windows 7, Windows Server 2008 R2, Windows Vista and Windows Server 2008: + // This notification is available starting with Windows 8 and Windows Server + // 2012. + // + // The Data member is a uint32 with one of the following values. + // + // 0x0 - The display is off. + // + // 0x1 - The display is on. + // + // 0x2 - The display is dimmed. + GUID_CONSOLE_DISPLAY_STATE = &GUID{0x6fe69556, 0x704a, 0x47a0, [8]byte{0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47}} + + // GUID_GLOBAL_USER_PRESENCE + // + // The user status associated with any session has changed. This represents + // the combined status of user presence across all local and remote sessions + // on the system. + // + // This notification is sent only to services and other programs running in + // session 0. User-mode applications should register for + // GUID_SESSION_USER_PRESENCE instead. + // + // Windows 7, Windows Server 2008 R2, Windows Vista and Windows Server 2008: + // This notification is available starting with Windows 8 and Windows Server + // 2012. + // + // The Data member is a DWORD with one of the following values. + // + // PowerUserPresent (0) - The user is present in any local or remote session + // on the system. + // + // PowerUserInactive (2) - The user is not present in any local or remote + // session on the system. + GUID_GLOBAL_USER_PRESENCE = &GUID{0x786E8A1D, 0xB427, 0x4344, [8]byte{0x92, 0x07, 0x09, 0xE7, 0x0B, 0xDC, 0xBE, 0xA9}} + + // GUID_IDLE_BACKGROUND_TASK + // + // The system is busy. This indicates that the system will not be moving + // into an idle state in the near future and that the current time is a good + // time for components to perform background or idle tasks that would + // otherwise prevent the computer from entering an idle state. + // + // There is no notification when the system is able to move into an idle + // state. The idle background task notification does not indicate whether a + // user is present at the computer. The Data member has no information and + // can be ignored. + GUID_IDLE_BACKGROUND_TASK = &GUID{0x515c31d8, 0xf734, 0x163d, [8]byte{0xa0, 0xfd, 0x11, 0xa0, 0x8c, 0x91, 0xe8, 0xf1}} + + // GUID_MONITOR_POWER_ON + // + // The primary system monitor has been powered on or off. This notification + // is useful for components that actively render content to the display + // device, such as media visualization. These applications should register + // for this notification and stop rendering graphics content when the + // monitor is off to reduce system power consumption. The Data member is a + // DWORD that indicates the current monitor state. + // + // 0x0 - The monitor is off. + // + // 0x1 - The monitor is on. + // + // Windows 8 and Windows Server 2012: New applications should use + // GUID_CONSOLE_DISPLAY_STATE instead of this notification. + GUID_MONITOR_POWER_ON = &GUID{0x02731015, 0x4510, 0x4526, [8]byte{0x99, 0xe6, 0xe5, 0xa1, 0x7e, 0xbd, 0x1a, 0xea}} + + // GUID_POWER_SAVING_STATUS + // + // Battery saver has been turned off or on in response to changing power + // conditions. This notification is useful for components that participate + // in energy conservation. These applications should register for this + // notification and save power when battery saver is on. + // + // The Data member is a DWORD that indicates battery saver state. + // + // 0x0 - Battery saver is off. + // + // 0x1 - Battery saver is on. Save energy where possible. + // + // For general information about battery saver, see battery saver (in the + // hardware component guidelines). + GUID_POWER_SAVING_STATUS = &GUID{0xE00958C0, 0xC213, 0x4ACE, [8]byte{0xAC, 0x77, 0xFE, 0xCC, 0xED, 0x2E, 0xEE, 0xA5}} + + // GUID_POWERSCHEME_PERSONALITY + // + // The active power scheme personality has changed. All power schemes map to + // one of these personalities. The Data member is a GUID that indicates the + // new active power scheme personality (GUID_MIN_POWER_SAVINGS, + // GUID_MAX_POWER_SAVINGS or GUID_TYPICAL_POWER_SAVINGS). + GUID_POWERSCHEME_PERSONALITY = &GUID{0x245d8541, 0x3943, 0x4422, [8]byte{0xb0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7}} + + // GUID_MIN_POWER_SAVINGS + // + // High Performance - The scheme is designed to deliver maximum performance + // at the expense of power consumption savings. + GUID_MIN_POWER_SAVINGS = &GUID{0x8c5e7fda, 0xe8bf, 0x4a96, [8]byte{0x9a, 0x85, 0xa6, 0xe2, 0x3a, 0x8c, 0x63, 0x5c}} + + // GUID_MAX_POWER_SAVINGS + // + // Power Saver - The scheme is designed to deliver maximum power consumption + // savings at the expense of system performance and responsiveness. + GUID_MAX_POWER_SAVINGS = &GUID{0xa1841308, 0x3541, 0x4fab, [8]byte{0xbc, 0x81, 0xf7, 0x15, 0x56, 0xf2, 0x0b, 0x4a}} + + // GUID_TYPICAL_POWER_SAVINGS + // + // Automatic - The scheme is designed to automatically balance performance + // and power consumption savings. + GUID_TYPICAL_POWER_SAVINGS = &GUID{0x381b4222, 0xf694, 0x41f0, [8]byte{0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e}} + + // GUID_SESSION_DISPLAY_STATUS + // + // The display associated with the application's session has been powered on + // or off. + // + // Windows 7, Windows Server 2008 R2, Windows Vista and Windows Server 2008: + // This notification is available starting with Windows 8 and Windows Server + // 2012. + // + // This notification is sent only to user-mode applications. Services and + // other programs running in session 0 do not receive this notification. The + // Data member is a DWORD with one of the following values. + // + // 0x0 - The display is off. + // + // 0x1 - The display is on. + // + // 0x2 - The display is dimmed. + GUID_SESSION_DISPLAY_STATUS = &GUID{0x2B84C20E, 0xAD23, 0x4ddf, [8]byte{0x93, 0xDB, 0x05, 0xFF, 0xBD, 0x7E, 0xFC, 0xA5}} + + // GUID_SESSION_USER_PRESENCE + // + // The user status associated with the application's session has changed. + // + // Windows 7, Windows Server 2008 R2, Windows Vista and Windows Server 2008: + // This notification is available starting with Windows 8 and Windows Server + // 2012. + // + // This notification is sent only to user-mode applications running in an + // interactive session. Services and other programs running in session 0 + // should register for GUID_GLOBAL_USER_PRESENCE. The Data member is a DWORD + // with one of the following values. + // + // PowerUserPresent (0) - The user is providing input to the session. + // + // PowerUserInactive (2) - The user activity timeout has elapsed with no + // interaction from the user. + // + // NOTE All applications that run in an interactive user-mode session should + // use this setting. When kernel mode applications register for monitor + // status they should use GUID_CONSOLE_DISPLAY_STATUS instead. + GUID_SESSION_USER_PRESENCE = &GUID{0x3C0F4548, 0xC03F, 0x4c4d, [8]byte{0xB9, 0xF2, 0x23, 0x7E, 0xDE, 0x68, 0x63, 0x76}} + + // GUID_SYSTEM_AWAYMODE + // + // The system is entering or exiting away mode. The Data member is a DWORD + // that indicates the current away mode state. + // + // 0x0 - The computer is exiting away mode. + // + // 0x1 - The computer is entering away mode. + GUID_SYSTEM_AWAYMODE = &GUID{0x98a7f580, 0x01f7, 0x48aa, [8]byte{0x9c, 0x0f, 0x44, 0x35, 0x2c, 0x29, 0xe5, 0xC0}} + + // GUID_DEVINTERFACE_COMPORT is defined for COM ports. + GUID_DEVINTERFACE_COMPORT = &GUID{0x86E0D1E0, 0x8089, 0x11D0, [8]byte{0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73}} +) + +const ( + // Power status has changed. + PBT_APMPOWERSTATUSCHANGE = 0x000A + + // Operation is resuming automatically from a low-power state. This message + // is sent every time the system resumes. + PBT_APMRESUMEAUTOMATIC = 0x0012 + + // Operation is resuming from a low-power state. This message is sent after + // PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as + // pressing a key. + PBT_APMRESUMESUSPEND = 0x0007 + + // System is suspending operation. + PBT_APMSUSPEND = 0x0004 + + // A power setting change event has been received. + PBT_POWERSETTINGCHANGE = 0x8013 +) + +// SYSTEM_POWER_CONDITION enumeration +const ( + // PoAc: the computer is powered by an AC power source (or similar, such as + // a laptop powered by a 12V automotive adapter). + PoAc = 0 + // PoDc: the system is receiving power from built-in batteries. + PoDc = 1 + // PoHot: the computer is powered by a short-term power source such as a UPS + // device. + PoHot = 2 + // PoConditionMaximum: values equal to or greater than this value indicate + // an out of range value. + PoConditionMaximum = 3 +) + +const ( + CSIDL_DESKTOP = 0x0000 // + CSIDL_INTERNET = 0x0001 // Internet Explorer (icon on desktop) + CSIDL_PROGRAMS = 0x0002 // Start Menu\Programs + CSIDL_CONTROLS = 0x0003 // My Computer\Control Panel + CSIDL_PRINTERS = 0x0004 // My Computer\Printers + CSIDL_PERSONAL = 0x0005 // My Documents + CSIDL_FAVORITES = 0x0006 // \Favorites + CSIDL_STARTUP = 0x0007 // Start Menu\Programs\Startup + CSIDL_RECENT = 0x0008 // \Recent + CSIDL_SENDTO = 0x0009 // \SendTo + CSIDL_BITBUCKET = 0x000A // \Recycle Bin + CSIDL_STARTMENU = 0x000B // \Start Menu + CSIDL_MYDOCUMENTS = CSIDL_PERSONAL // Personal was just a silly name for My Documents + CSIDL_MYMUSIC = 0x000D // "My Music" folder + CSIDL_MYVIDEO = 0x000E // "My Videos" folder + CSIDL_DESKTOPDIRECTORY = 0x0010 // \Desktop + CSIDL_DRIVES = 0x0011 // My Computer + CSIDL_NETWORK = 0x0012 // Network Neighborhood (My Network Places) + CSIDL_NETHOOD = 0x0013 // \nethood + CSIDL_FONTS = 0x0014 // windows\fonts + CSIDL_TEMPLATES = 0x0015 + CSIDL_COMMON_STARTMENU = 0x0016 // All Users\Start Menu + CSIDL_COMMON_PROGRAMS = 0x0017 // All Users\Start Menu\Programs + CSIDL_COMMON_STARTUP = 0x0018 // All Users\Startup + CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019 // All Users\Desktop + CSIDL_APPDATA = 0x001A // \Application Data + CSIDL_PRINTHOOD = 0x001B // \PrintHood + CSIDL_LOCAL_APPDATA = 0x001C // \Local Settings\Applicaiton Data (non roaming) + CSIDL_ALTSTARTUP = 0x001D // non localized startup + CSIDL_COMMON_ALTSTARTUP = 0x001E // non localized common startup + CSIDL_COMMON_FAVORITES = 0x001F + CSIDL_INTERNET_CACHE = 0x0020 + CSIDL_COOKIES = 0x0021 + CSIDL_HISTORY = 0x0022 + CSIDL_COMMON_APPDATA = 0x0023 // All Users\Application Data + CSIDL_WINDOWS = 0x0024 // GetWindowsDirectory() + CSIDL_SYSTEM = 0x0025 // GetSystemDirectory() + CSIDL_PROGRAM_FILES = 0x0026 // C:\Program Files + CSIDL_MYPICTURES = 0x0027 // C:\Program Files\My Pictures + CSIDL_PROFILE = 0x0028 // USERPROFILE + CSIDL_SYSTEMX86 = 0x0029 // x86 system directory on RISC + CSIDL_PROGRAM_FILESX86 = 0x002A // x86 C:\Program Files on RISC + CSIDL_PROGRAM_FILES_COMMON = 0x002B // C:\Program Files\Common + CSIDL_PROGRAM_FILES_COMMONX86 = 0x002C // x86 Program Files\Common on RISC + CSIDL_COMMON_TEMPLATES = 0x002D // All Users\Templates + CSIDL_COMMON_DOCUMENTS = 0x002E // All Users\Documents + CSIDL_COMMON_ADMINTOOLS = 0x002F // All Users\Start Menu\Programs\Administrative Tools + CSIDL_ADMINTOOLS = 0x0030 // \Start Menu\Programs\Administrative Tools + CSIDL_CONNECTIONS = 0x0031 // Network and Dial-up Connections + CSIDL_COMMON_MUSIC = 0x0035 // All Users\My Music + CSIDL_COMMON_PICTURES = 0x0036 // All Users\My Pictures + CSIDL_COMMON_VIDEO = 0x0037 // All Users\My Video + CSIDL_RESOURCES = 0x0038 // Resource Direcotry +) + +// Drive types to use with GetDriveType. +const ( + DRIVE_UNKNOWN = 0 + DRIVE_NO_ROOT_DIR = 1 + DRIVE_REMOVABLE = 2 + DRIVE_FIXED = 3 + DRIVE_REMOTE = 4 + DRIVE_CDROM = 5 + DRIVE_RAMDISK = 6 +) + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexw +const ( + VER_PLATFORM_WIN32_NT = 2 +) + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexw +const ( + VER_NT_SERVER = 0x0000003 + VER_NT_DOMAIN_CONTROLLER = 0x0000002 + VER_NT_WORKSTATION = 0x0000001 +) + +// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexw +const ( + VER_SUITE_BACKOFFICE = 0x00000004 + VER_SUITE_BLADE = 0x00000400 + VER_SUITE_COMPUTE_SERVER = 0x00004000 + VER_SUITE_DATACENTER = 0x00000080 + VER_SUITE_ENTERPRISE = 0x00000002 + VER_SUITE_EMBEDDEDNT = 0x00000040 + VER_SUITE_PERSONAL = 0x00000200 + VER_SUITE_SINGLEUSERTS = 0x00000100 + VER_SUITE_SMALLBUSINESS = 0x00000001 + VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x00000020 + VER_SUITE_STORAGE_SERVER = 0x00002000 + VER_SUITE_TERMINAL = 0x00000010 + VER_SUITE_WH_SERVER = 0x00008000 + VER_SUITE_MULTIUSERTS = 0x00020000 +) + +// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info +const ( + PROCESSOR_ARCHITECTURE_AMD64 = 9 + PROCESSOR_ARCHITECTURE_ARM = 5 + PROCESSOR_ARCHITECTURE_ARM64 = 12 + PROCESSOR_ARCHITECTURE_IA64 = 6 + PROCESSOR_ARCHITECTURE_INTEL = 0 + PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF +) + +// Flags for SetLayeredWindowAttributes. +const ( + LWA_COLORKEY = 0x1 + LWA_ALPHA = 0x2 +) + +// Flags for RedrawWindow. +const ( + RDW_INVALIDATE = 0x0001 + RDW_INTERNALPAINT = 0x0002 + RDW_ERASE = 0x0004 + RDW_VALIDATE = 0x0008 + RDW_NOINTERNALPAINT = 0x0010 + RDW_NOERASE = 0x0020 + RDW_NOCHILDREN = 0x0040 + RDW_ALLCHILDREN = 0x0080 + RDW_UPDATENOW = 0x0100 + RDW_ERASENOW = 0x0200 + RDW_FRAME = 0x0400 + RDW_NOFRAME = 0x0800 +) + +// DrawIconEx flags. +const ( + DI_COMPAT = 0x0004 + DI_DEFAULTSIZE = 0x0008 + DI_IMAGE = 0x0002 + DI_MASK = 0x0001 + DI_NOMIRROR = 0x0010 + DI_NORMAL = DI_IMAGE | DI_MASK +) + +// Track bar messages. +const ( + TBM_GETPOS = WM_USER + TBM_GETRANGEMIN = WM_USER + 1 + TBM_GETRANGEMAX = WM_USER + 2 + TBM_GETTIC = WM_USER + 3 + TBM_SETTIC = WM_USER + 4 + TBM_SETPOS = WM_USER + 5 + TBM_SETRANGE = WM_USER + 6 + TBM_SETRANGEMIN = WM_USER + 7 + TBM_SETRANGEMAX = WM_USER + 8 + TBM_CLEARTICS = WM_USER + 9 + TBM_SETSEL = WM_USER + 10 + TBM_SETSELSTART = WM_USER + 11 + TBM_SETSELEND = WM_USER + 12 + TBM_GETPTICS = WM_USER + 14 + TBM_GETTICPOS = WM_USER + 15 + TBM_GETNUMTICS = WM_USER + 16 + TBM_GETSELSTART = WM_USER + 17 + TBM_GETSELEND = WM_USER + 18 + TBM_CLEARSEL = WM_USER + 19 + TBM_SETTICFREQ = WM_USER + 20 + TBM_SETPAGESIZE = WM_USER + 21 + TBM_GETPAGESIZE = WM_USER + 22 + TBM_SETLINESIZE = WM_USER + 23 + TBM_GETLINESIZE = WM_USER + 24 + TBM_GETTHUMBRECT = WM_USER + 25 + TBM_GETCHANNELRECT = WM_USER + 26 + TBM_SETTHUMBLENGTH = WM_USER + 27 + TBM_GETTHUMBLENGTH = WM_USER + 28 +) + +// Track bar styles. +const ( + TBS_AUTOTICKS = 1 + TBS_VERT = 2 + TBS_HORZ = 0 + TBS_TOP = 4 + TBS_BOTTOM = 0 + TBS_LEFT = 4 + TBS_RIGHT = 0 + TBS_BOTH = 8 + TBS_NOTICKS = 16 + TBS_ENABLESELRANGE = 32 + TBS_FIXEDLENGTH = 64 + TBS_NOTHUMB = 128 +) + +// Track bar scroll notifications. +const ( + TB_LINEUP = 0 + TB_LINEDOWN = 1 + TB_PAGEUP = 2 + TB_PAGEDOWN = 3 + TB_THUMBPOSITION = 4 + TB_THUMBTRACK = 5 + TB_TOP = 6 + TB_BOTTOM = 7 + TB_ENDTRACK = 8 +) + +// Clip region types, e.g. returned from IntersectClipRect. +const ( + ERROR = 0 + NULLREGION = 1 + SIMPLEREGION = 2 + COMPLEXREGION = 3 +) + +// Modes for CombineRgn. +const ( + RGN_AND = 1 + RGN_OR = 2 + RGN_XOR = 3 + RGN_DIFF = 4 + RGN_COPY = 5 + RGN_MIN = RGN_AND + RGN_MAX = RGN_COPY +) + +const ( + DIGCF_PRESENT = 0x0002 + DIGCF_ALLCLASSES = 0x0004 + DIGCF_PROFILE = 0x0008 + DIGCF_DEVICEINTERFACE = 0x0010 + DIGCF_INTERFACEDEVICE = DIGCF_DEVICEINTERFACE +) + +const ( + DICS_FLAG_GLOBAL = 0x00000001 + DICS_FLAG_CONFIGSPECIFIC = 0x00000002 + DICS_FLAG_CONFIGGENERAL = 0x00000004 +) + +const ( + DIREG_DEV = 0x00000001 + DIREG_DRV = 0x00000002 + DIREG_BOTH = 0x00000004 +) + +const ( + ABM_NEW = 0x0 + ABM_REMOVE = 0x1 + ABM_QUERYPOS = 0x2 + ABM_SETPOS = 0x3 + ABM_GETSTATE = 0x4 + ABM_GETTASKBARPOS = 0x5 + ABM_ACTIVATE = 0x6 + ABM_GETAUTOHIDEBAR = 0x7 + ABM_SETAUTOHIDEBAR = 0x8 + ABM_WINDOWPOSCHANGED = 0x9 + ABM_SETSTATE = 0xA +) + +const ( + ACM_OPEN = 0x464 + ACM_PLAY = 0x465 + ACM_STOP = 0x466 +) + +const ( + CBEM_GETCOMBOCONTROL = 0x406 + CBEM_GETEDITCONTROL = 0x407 + CBEM_GETEXSTYLE = 0x409 + CBEM_GETEXTENDEDSTYLE = 0x409 + CBEM_GETIMAGELIST = 0x403 + CBEM_GETITEMA = 0x404 + CBEM_GETITEMW = 0x40D + CBEM_HASEDITCHANGED = 0x40A + CBEM_INSERTITEMA = 0x401 + CBEM_INSERTITEMW = 0x40B + CBEM_SETEXSTYLE = 0x408 + CBEM_SETEXTENDEDSTYLE = 0x40E + CBEM_SETIMAGELIST = 0x402 + CBEM_SETITEMA = 0x405 + CBEM_SETITEMW = 0x40C + CBEM_GETUNICODEFORMAT = 0x2006 + CBEM_SETUNICODEFORMAT = 0x2005 +) + +const ( + CDM_GETFILEPATH = 0x465 + CDM_GETFOLDERIDLIST = 0x467 + CDM_GETFOLDERPATH = 0x466 + CDM_GETSPEC = 0x464 + CDM_HIDECONTROL = 0x469 + CDM_SETCONTROLTEXT = 0x468 + CDM_SETDEFEXT = 0x46A +) + +const ( + DL_BEGINDRAG = 0x485 + DL_CANCELDRAG = 0x488 + DL_COPYCURSOR = 0x002 + DL_CURSORSET = 0x000 + DL_DRAGGING = 0x486 + DL_DROPPED = 0x487 + DL_MOVECURSOR = 0x003 + DL_STOPCURSOR = 0x001 +) + +const ( + DM_GETDEFID = 0x400 + DM_REPOSITION = 0x402 + DM_SETDEFID = 0x401 +) + +const ( + DTM_GETMCCOLOR = 0x1007 + DTM_GETMCFONT = 0x100A + DTM_GETMONTHCAL = 0x1008 + DTM_GETRANGE = 0x1003 + DTM_GETSYSTEMTIME = 0x1001 + DTM_SETFORMATA = 0x1005 + DTM_SETFORMATW = 0x1032 + DTM_SETMCCOLOR = 0x1006 + DTM_SETMCFONT = 0x1009 + DTM_SETRANGE = 0x1004 + DTM_SETSYSTEMTIME = 0x1002 +) + +const ( + HDM_CLEARFILTER = 0x1218 + HDM_CREATEDRAGIMAGE = 0x1210 + HDM_DELETEITEM = 0x1202 + HDM_EDITFILTER = 0x1217 + HDM_GETBITMAPMARGIN = 0x1215 + HDM_GETIMAGELIST = 0x1209 + HDM_GETITEM = 0x1203 + HDM_GETITEMCOUNT = 0x1200 + HDM_GETITEMRECT = 0x1207 + HDM_GETORDERARRAY = 0x1211 + HDM_GETUNICODEFORMAT = 0x2006 + HDM_HITTEST = 0x1206 + HDM_INSERTITEM = 0x1201 + HDM_LAYOUT = 0x1205 + HDM_ORDERTOINDEX = 0x120F + HDM_SETBITMAPMARGIN = 0x1214 + HDM_SETFILTERCHANGETIMEOUT = 0x1216 + HDM_SETHOTDIVIDER = 0x1213 + HDM_SETIMAGELIST = 0x1208 + HDM_SETITEM = 0x1204 + HDM_SETORDERARRAY = 0x1212 + HDM_SETUNICODEFORMAT = 0x2005 +) + +const ( + HKM_GETHOTKEY = 0x402 + HKM_SETHOTKEY = 0x401 + HKM_SETRULES = 0x403 +) + +const ( + IPM_CLEARADDRESS = 0x464 + IPM_GETADDRESS = 0x466 + IPM_ISBLANK = 0x469 + IPM_SETADDRESS = 0x465 + IPM_SETFOCUS = 0x468 + IPM_SETRANGE = 0x467 +) + +const ( + LBCB_CARETOFF = 0x01A4 + LBCB_CARETON = 0x01A3 +) + +const ( + MCM_GETCOLOR = 0x100B + MCM_GETCURSEL = 0x1001 + MCM_GETFIRSTDAYOFWEEK = 0x1010 + MCM_GETMAXSELCOUNT = 0x1003 + MCM_GETMAXTODAYWIDTH = 0x1015 + MCM_GETMINREQRECT = 0x1009 + MCM_GETMONTHDELTA = 0x1013 + MCM_GETMONTHRANGE = 0x1007 + MCM_GETRANGE = 0x1011 + MCM_GETSELRANGE = 0x1005 + MCM_GETTODAY = 0x100D + MCM_GETUNICODEFORMAT = 0x2006 + MCM_HITTEST = 0x100E + MCM_SETCOLOR = 0x100A + MCM_SETCURSEL = 0x1002 + MCM_SETDAYSTATE = 0x1008 + MCM_SETFIRSTDAYOFWEEK = 0x100F + MCM_SETMAXSELCOUNT = 0x1004 + MCM_SETMONTHDELTA = 0x1014 + MCM_SETRANGE = 0x1012 + MCM_SETSELRANGE = 0x1006 + MCM_SETTODAY = 0x100C + MCM_SETUNICODEFORMAT = 0x2005 +) + +const ( + MN_BUTTONDOWN = 0x01ED + MN_BUTTONUP = 0x01EF + MN_CANCELMENUS = 0x01E6 + MN_CLOSEHIERARCHY = 0x01E4 + MN_DBLCLK = 0x01F1 + MN_FINDMENUWINDOWFROMPOINT = 0x01EB + MN_GETHMENU = 0x01E1 + MN_GETPPOPUPMENU = 0x01EA + MN_MOUSEMOVE = 0x01EE + MN_OPENHIERARCHY = 0x01E3 + MN_SELECTFIRSTVALIDITEM = 0x01E7 + MN_SELECTITEM = 0x01E5 + MN_SETHMENU = 0x01E0 + MN_SETTIMERTOOPENHIERARCHY = 0x01F0 + MN_SHOWPOPUPWINDOW = 0x01EC + MN_SIZEWINDOW = 0x01E2 +) + +const ( + OCM_CHARTOITEM = 0x202F + OCM_COMMAND = 0x2111 + OCM_COMPAREITEM = 0x2039 + OCM_CTLCOLORBTN = 0x2135 + OCM_CTLCOLORDLG = 0x2136 + OCM_CTLCOLOREDIT = 0x2133 + OCM_CTLCOLORLISTBOX = 0x2134 + OCM_CTLCOLORMSGBOX = 0x2132 + OCM_CTLCOLORSCROLLBAR = 0x2137 + OCM_CTLCOLORSTATIC = 0x2138 + OCM_DELETEITEM = 0x202D + OCM_DRAWITEM = 0x202B + OCM_HSCROLL = 0x2114 + OCM_MEASUREITEM = 0x202C + OCM_NOTIFY = 0x204E + OCM_PARENTNOTIFY = 0x2210 + OCM_VKEYTOITEM = 0x202E + OCM_VSCROLL = 0x2115 +) + +const ( + PGM_FORWARDMOUSE = 0x1403 + PGM_GETBKCOLOR = 0x1405 + PGM_GETBORDER = 0x1407 + PGM_GETBUTTONSIZE = 0x140B + PGM_GETBUTTONSTATE = 0x140C + PGM_GETDROPTARGET = 0x2004 + PGM_GETPOS = 0x1409 + PGM_RECALCSIZE = 0x1402 + PGM_SETBKCOLOR = 0x1404 + PGM_SETBORDER = 0x1406 + PGM_SETBUTTONSIZE = 0x140A + PGM_SETCHILD = 0x1401 + PGM_SETPOS = 0x1408 +) + +const ( + PSM_ADDPAGE = 0x467 + PSM_APPLY = 0x46E + PSM_CANCELTOCLOSE = 0x46B + PSM_CHANGED = 0x468 + PSM_GETCURRENTPAGEHWND = 0x476 + PSM_GETRESULT = 0x487 + PSM_GETTABCONTROL = 0x474 + PSM_HWNDTOINDEX = 0x481 + PSM_IDTOINDEX = 0x485 + PSM_INDEXTOHWND = 0x482 + PSM_INDEXTOID = 0x486 + PSM_INDEXTOPAGE = 0x484 + PSM_INSERTPAGE = 0x477 + PSM_ISDIALOGMESSAGE = 0x475 + PSM_PAGETOINDEX = 0x483 + PSM_PRESSBUTTON = 0x471 + PSM_QUERYSIBLINGS = 0x46C + PSM_REBOOTSYSTEM = 0x46A + PSM_RECALCPAGESIZES = 0x488 + PSM_REMOVEPAGE = 0x466 + PSM_RESTARTWINDOWS = 0x469 + PSM_SETCURSEL = 0x465 + PSM_SETCURSELID = 0x472 + PSM_SETFINISHTEXT = 0x473 + PSM_SETHEADERSUBTITLEA = 0x47F + PSM_SETHEADERSUBTITLEW = 0x480 + PSM_SETHEADERTITLEA = 0x47D + PSM_SETHEADERTITLEW = 0x47E + PSM_SETTITLE = 0x46F + PSM_SETWIZBUTTONS = 0x470 + PSM_UNCHANGED = 0x46D +) + +const ( + RB_BEGINDRAG = 0x418 + RB_DELETEBAND = 0x402 + RB_DRAGMOVE = 0x41A + RB_ENDDRAG = 0x419 + RB_GETBANDBORDERS = 0x422 + RB_GETBANDCOUNT = 0x40C + RB_GETBANDINFO = 0x41D + RB_GETBANDINFOA = 0x41D + RB_GETBANDINFOW = 0x41C + RB_GETBARHEIGHT = 0x41B + RB_GETBARINFO = 0x403 + RB_GETBKCOLOR = 0x414 + RB_GETPALETTE = 0x426 + RB_GETRECT = 0x409 + RB_GETROWCOUNT = 0x40D + RB_GETROWHEIGHT = 0x40E + RB_GETTEXTCOLOR = 0x416 + RB_GETTOOLTIPS = 0x411 + RB_HITTEST = 0x408 + RB_IDTOINDEX = 0x410 + RB_INSERTBAND = 0x401 + RB_INSERTBANDA = 0x401 + RB_INSERTBANDW = 0x40A + RB_MAXIMIZEBAND = 0x41F + RB_MINIMIZEBAND = 0x41E + RB_MOVEBAND = 0x427 + RB_PUSHCHEVRON = 0x42B + RB_SETBANDINFO = 0x406 + RB_SETBANDINFOA = 0x406 + RB_SETBANDINFOW = 0x40B + RB_SETBARINFO = 0x404 + RB_SETBKCOLOR = 0x413 + RB_SETPALETTE = 0x425 + RB_SETPARENT = 0x407 + RB_SETTEXTCOLOR = 0x415 + RB_SETTOOLTIPS = 0x412 + RB_SHOWBAND = 0x423 + RB_SIZETORECT = 0x417 + RB_SETCOLORSCHEME = 0x2002 + RB_GETCOLORSCHEME = 0x2003 + RB_GETDROPTARGET = 0x2004 + RB_SETUNICODEFORMAT = 0x2005 + RB_GETUNICODEFORMAT = 0x2006 +) + +const ( + SBM_ENABLE_ARROWS = 0xE4 + SBM_GETPOS = 0xE1 + SBM_GETRANGE = 0xE3 + SBM_GETSCROLLINFO = 0xEA + SBM_SETPOS = 0xE0 + SBM_SETRANGE = 0xE2 + SBM_SETRANGEREDRAW = 0xE6 + SBM_SETSCROLLINFO = 0xE9 +) + +const ( + SB_GETBORDERS = 0x407 + SB_GETICON = 0x414 + SB_GETPARTS = 0x406 + SB_GETRECT = 0x40A + SB_GETTEXTA = 0x402 + SB_GETTEXTLENGTHA = 0x403 + SB_GETTEXTLENGTHW = 0x40C + SB_GETTEXTW = 0x40D + SB_GETTIPTEXTA = 0x412 + SB_GETTIPTEXTW = 0x413 + SB_ISSIMPLE = 0x40E + SB_SETICON = 0x40F + SB_SETMINHEIGHT = 0x408 + SB_SETPARTS = 0x404 + SB_SETTEXTA = 0x401 + SB_SETTEXTW = 0x40B + SB_SETTIPTEXTA = 0x410 + SB_SETTIPTEXTW = 0x411 + SB_SIMPLE = 0x409 + SB_SETBKCOLOR = 0x2001 + SB_SETUNICODEFORMAT = 0x2005 + SB_GETUNICODEFORMAT = 0x2006 +) + +const ( + STM_GETICON = 0x171 + STM_GETIMAGE = 0x173 + STM_SETICON = 0x170 + STM_SETIMAGE = 0x172 +) + +const ( + TB_ADDBITMAP = 0x413 + TB_ADDBUTTONS = 0x414 + TB_ADDSTRING = 0x41C + TB_AUTOSIZE = 0x421 + TB_BUTTONCOUNT = 0x418 + TB_BUTTONSTRUCTSIZE = 0x41E + TB_CHANGEBITMAP = 0x42B + TB_CHECKBUTTON = 0x402 + TB_COMMANDTOINDEX = 0x419 + TB_CUSTOMIZE = 0x41B + TB_DELETEBUTTON = 0x416 + TB_ENABLEBUTTON = 0x401 + TB_GETANCHORHIGHLIGHT = 0x44A + TB_GETBITMAP = 0x42C + TB_GETBITMAPFLAGS = 0x429 + TB_GETBUTTON = 0x417 + TB_GETBUTTONINFOA = 0x441 + TB_GETBUTTONINFOW = 0x43F + TB_GETBUTTONSIZE = 0x43A + TB_GETBUTTONTEXT = 0x42D + TB_GETCOLORSCHEME = 0x2003 + TB_GETDISABLEDIMAGELIST = 0x437 + TB_GETEXTENDEDSTYLE = 0x455 + TB_GETHOTIMAGELIST = 0x435 + TB_GETHOTITEM = 0x447 + TB_GETIMAGELIST = 0x431 + TB_GETINSERTMARK = 0x44F + TB_GETINSERTMARKCOLOR = 0x459 + TB_GETITEMRECT = 0x41D + TB_GETMAXSIZE = 0x453 + TB_GETOBJECT = 0x43E + TB_GETPADDING = 0x456 + TB_GETRECT = 0x433 + TB_GETROWS = 0x428 + TB_GETSTATE = 0x412 + TB_GETSTRING = 0x45C + TB_GETSTYLE = 0x439 + TB_GETTEXTROWS = 0x43D + TB_GETTOOLTIPS = 0x423 + TB_GETUNICODEFORMAT = 0x2006 + TB_HIDEBUTTON = 0x404 + TB_HITTEST = 0x445 + TB_INDETERMINATE = 0x405 + TB_INSERTBUTTON = 0x415 + TB_INSERTMARKHITTEST = 0x451 + TB_ISBUTTONCHECKED = 0x40A + TB_ISBUTTONENABLED = 0x409 + TB_ISBUTTONHIDDEN = 0x40C + TB_ISBUTTONHIGHLIGHTED = 0x40E + TB_ISBUTTONINDETERMINATE = 0x40D + TB_ISBUTTONPRESSED = 0x40B + TB_LOADIMAGES = 0x432 + TB_MAPACCELERATORA = 0x44E + TB_MAPACCELERATORW = 0x45A + TB_MARKBUTTON = 0x406 + TB_MOVEBUTTON = 0x452 + TB_PRESSBUTTON = 0x403 + TB_REPLACEBITMAP = 0x42E + TB_SAVERESTORE = 0x41A + TB_SETANCHORHIGHLIGHT = 0x449 + TB_SETBITMAPSIZE = 0x420 + TB_SETBUTTONINFOA = 0x442 + TB_SETBUTTONINFOW = 0x440 + TB_SETBUTTONSIZE = 0x41F + TB_SETBUTTONWIDTH = 0x43B + TB_SETCMDID = 0x42A + TB_SETCOLORSCHEME = 0x2002 + TB_SETDISABLEDIMAGELIST = 0x436 + TB_SETDRAWTEXTFLAGS = 0x446 + TB_SETEXTENDEDSTYLE = 0x454 + TB_SETHOTIMAGELIST = 0x434 + TB_SETHOTITEM = 0x448 + TB_SETIMAGELIST = 0x430 + TB_SETINDENT = 0x42F + TB_SETINSERTMARK = 0x450 + TB_SETINSERTMARKCOLOR = 0x458 + TB_SETMAXTEXTROWS = 0x43C + TB_SETPADDING = 0x457 + TB_SETPARENT = 0x425 + TB_SETROWS = 0x427 + TB_SETSTATE = 0x411 + TB_SETSTYLE = 0x438 + TB_SETTOOLTIPS = 0x424 + TB_SETUNICODEFORMAT = 0x2005 +) + +const ( + TCM_ADJUSTRECT = 0x1328 + TCM_DELETEALLITEMS = 0x1309 + TCM_DELETEITEM = 0x1308 + TCM_DESELECTALL = 0x1332 + TCM_GETCURFOCUS = 0x132F + TCM_GETCURSEL = 0x130B + TCM_GETEXTENDEDSTYLE = 0x1335 + TCM_GETIMAGELIST = 0x1302 + TCM_GETITEM = 0x1305 + TCM_GETITEMCOUNT = 0x1304 + TCM_GETITEMRECT = 0x130A + TCM_GETROWCOUNT = 0x132C + TCM_GETTOOLTIPS = 0x132D + TCM_GETUNICODEFORMAT = 0x2006 + TCM_HIGHLIGHTITEM = 0x1333 + TCM_HITTEST = 0x130D + TCM_INSERTITEM = 0x1307 + TCM_REMOVEIMAGE = 0x132A + TCM_SETCURFOCUS = 0x1330 + TCM_SETCURSEL = 0x130C + TCM_SETEXTENDEDSTYLE = 0x1334 + TCM_SETIMAGELIST = 0x1303 + TCM_SETITEM = 0x1306 + TCM_SETITEMEXTRA = 0x130E + TCM_SETITEMSIZE = 0x1329 + TCM_SETMINTABWIDTH = 0x1331 + TCM_SETPADDING = 0x132B + TCM_SETTOOLTIPS = 0x132E + TCM_SETUNICODEFORMAT = 0x2005 +) + +const ( + TVM_CREATEDRAGIMAGE = 0x1112 + TVM_DELETEITEM = 0x1101 + TVM_EDITLABEL = 0x110E + TVM_ENDEDITLABELNOW = 0x1116 + TVM_ENSUREVISIBLE = 0x1114 + TVM_EXPAND = 0x1102 + TVM_GETBKCOLOR = 0x111F + TVM_GETCOUNT = 0x1105 + TVM_GETEDITCONTROL = 0x110F + TVM_GETIMAGELIST = 0x1108 + TVM_GETINDENT = 0x1106 + TVM_GETINSERTMARKCOLOR = 0x1126 + TVM_GETISEARCHSTRING = 0x1117 + TVM_GETITEM = 0x110C + TVM_GETITEMHEIGHT = 0x111C + TVM_GETITEMRECT = 0x1104 + TVM_GETITEMSTATE = 0x1127 + TVM_GETLINECOLOR = 0x1129 + TVM_GETNEXTITEM = 0x110A + TVM_GETSCROLLTIME = 0x1122 + TVM_GETTEXTCOLOR = 0x1120 + TVM_GETTOOLTIPS = 0x1119 + TVM_GETUNICODEFORMAT = 0x2006 + TVM_GETVISIBLECOUNT = 0x1110 + TVM_HITTEST = 0x1111 + TVM_INSERTITEM = 0x1100 + TVM_SELECTITEM = 0x110B + TVM_SETBKCOLOR = 0x111D + TVM_SETIMAGELIST = 0x1109 + TVM_SETINDENT = 0x1107 + TVM_SETINSERTMARK = 0x111A + TVM_SETINSERTMARKCOLOR = 0x1125 + TVM_SETITEM = 0x110D + TVM_SETITEMHEIGHT = 0x111B + TVM_SETLINECOLOR = 0x1128 + TVM_SETSCROLLTIME = 0x1121 + TVM_SETTEXTCOLOR = 0x111E + TVM_SETTOOLTIPS = 0x1118 + TVM_SETUNICODEFORMAT = 0x2005 + TVM_SORTCHILDREN = 0x1113 + TVM_SORTCHILDRENCB = 0x1115 +) + +// PROCESS_DPI_AWARENESS +const ( + PROCESS_DPI_UNAWARE = 0 + PROCESS_SYSTEM_DPI_AWARE = 1 + PROCESS_PER_MONITOR_DPI_AWARE = 2 +) + +// WM_DEVICECHANGE WPARAM options +const ( + DBT_DEVNODES_CHANGED = 0x0007 + DBT_QUERYCHANGECONFIG = 0x0017 + DBT_CONFIGCHANGED = 0x0018 + DBT_CONFIGCHANGECANCELED = 0x0019 + DBT_DEVICEARRIVAL = 0x8000 + DBT_DEVICEQUERYREMOVE = 0x8001 + DBT_DEVICEQUERYREMOVEFAILED = 0x8002 + DBT_DEVICEREMOVEPENDING = 0x8003 + DBT_DEVICEREMOVECOMPLETE = 0x8004 + DBT_DEVICETYPESPECIFIC = 0x8005 + DBT_CUSTOMEVENT = 0x8006 + DBT_USERDEFINED = 0xFFFF +) + +const ( + SPI_GETACCESSTIMEOUT = 0x003C + SPI_GETAUDIODESCRIPTION = 0x0074 + SPI_GETCLIENTAREAANIMATION = 0x1042 + SPI_GETDISABLEOVERLAPPEDCONTENT = 0x1040 + SPI_GETFILTERKEYS = 0x0032 + SPI_GETFOCUSBORDERHEIGHT = 0x2010 + SPI_GETFOCUSBORDERWIDTH = 0x200E + SPI_GETHIGHCONTRAST = 0x0042 + SPI_GETLOGICALDPIOVERRIDE = 0x009E + SPI_GETMESSAGEDURATION = 0x2016 + SPI_GETMOUSECLICKLOCK = 0x101E + SPI_GETMOUSECLICKLOCKTIME = 0x2008 + SPI_GETMOUSEKEYS = 0x0036 + SPI_GETMOUSESONAR = 0x101C + SPI_GETMOUSEVANISH = 0x1020 + SPI_GETSCREENREADER = 0x0046 + SPI_GETSERIALKEYS = 0x003E + SPI_GETSHOWSOUNDS = 0x0038 + SPI_GETSOUNDSENTRY = 0x0040 + SPI_GETSTICKYKEYS = 0x003A + SPI_GETTOGGLEKEYS = 0x0034 + SPI_SETACCESSTIMEOUT = 0x003D + SPI_SETAUDIODESCRIPTION = 0x0075 + SPI_SETCLIENTAREAANIMATION = 0x1043 + SPI_SETDISABLEOVERLAPPEDCONTENT = 0x1041 + SPI_SETFILTERKEYS = 0x0033 + SPI_SETFOCUSBORDERHEIGHT = 0x2011 + SPI_SETFOCUSBORDERWIDTH = 0x200F + SPI_SETHIGHCONTRAST = 0x0043 + SPI_SETLOGICALDPIOVERRIDE = 0x009F + SPI_SETMESSAGEDURATION = 0x2017 + SPI_SETMOUSECLICKLOCK = 0x101F + SPI_SETMOUSECLICKLOCKTIME = 0x2009 + SPI_SETMOUSEKEYS = 0x0037 + SPI_SETMOUSESONAR = 0x101D + SPI_SETMOUSEVANISH = 0x1021 + SPI_SETSCREENREADER = 0x0047 + SPI_SETSERIALKEYS = 0x003F + SPI_SETSHOWSOUNDS = 0x0039 + SPI_SETSOUNDSENTRY = 0x0041 + SPI_SETSTICKYKEYS = 0x003B + SPI_SETTOGGLEKEYS = 0x0035 + SPI_GETCLEARTYPE = 0x1048 + SPI_GETDESKWALLPAPER = 0x0073 + SPI_GETDROPSHADOW = 0x1024 + SPI_GETFLATMENU = 0x1022 + SPI_GETFONTSMOOTHING = 0x004A + SPI_GETFONTSMOOTHINGCONTRAST = 0x200C + SPI_GETFONTSMOOTHINGORIENTATION = 0x2012 + SPI_GETFONTSMOOTHINGTYPE = 0x200A + SPI_GETWORKAREA = 0x0030 + SPI_SETCLEARTYPE = 0x1049 + SPI_SETCURSORS = 0x0057 + SPI_SETDESKPATTERN = 0x0015 + SPI_SETDESKWALLPAPER = 0x0014 + SPI_SETDROPSHADOW = 0x1025 + SPI_SETFLATMENU = 0x1023 + SPI_SETFONTSMOOTHING = 0x004B + SPI_SETFONTSMOOTHINGCONTRAST = 0x200D + SPI_SETFONTSMOOTHINGORIENTATION = 0x2013 + SPI_SETFONTSMOOTHINGTYPE = 0x200B + SPI_SETWORKAREA = 0x002F + SPI_GETICONMETRICS = 0x002D + SPI_GETICONTITLELOGFONT = 0x001F + SPI_GETICONTITLEWRAP = 0x0019 + SPI_ICONHORIZONTALSPACING = 0x000D + SPI_ICONVERTICALSPACING = 0x0018 + SPI_SETICONMETRICS = 0x002E + SPI_SETICONS = 0x0058 + SPI_SETICONTITLELOGFONT = 0x0022 + SPI_SETICONTITLEWRAP = 0x001A + SPI_GETBEEP = 0x0001 + SPI_GETBLOCKSENDINPUTRESETS = 0x1026 + SPI_GETCONTACTVISUALIZATION = 0x2018 + SPI_GETDEFAULTINPUTLANG = 0x0059 + SPI_GETGESTUREVISUALIZATION = 0x201A + SPI_GETKEYBOARDCUES = 0x100A + SPI_GETKEYBOARDDELAY = 0x0016 + SPI_GETKEYBOARDPREF = 0x0044 + SPI_GETKEYBOARDSPEED = 0x000A + SPI_GETMOUSE = 0x0003 + SPI_GETMOUSEHOVERHEIGHT = 0x0064 + SPI_GETMOUSEHOVERTIME = 0x0066 + SPI_GETMOUSEHOVERWIDTH = 0x0062 + SPI_GETMOUSESPEED = 0x0070 + SPI_GETMOUSETRAILS = 0x005E + SPI_GETMOUSEWHEELROUTING = 0x201C + SPI_GETPENVISUALIZATION = 0x201E + SPI_GETSNAPTODEFBUTTON = 0x005F + SPI_GETSYSTEMLANGUAGEBAR = 0x1050 + SPI_GETTHREADLOCALINPUTSETTINGS = 0x104E + SPI_GETWHEELSCROLLCHARS = 0x006C + SPI_GETWHEELSCROLLLINES = 0x0068 + SPI_SETBEEP = 0x0002 + SPI_SETBLOCKSENDINPUTRESETS = 0x1027 + SPI_SETCONTACTVISUALIZATION = 0x2019 + SPI_SETDEFAULTINPUTLANG = 0x005A + SPI_SETDOUBLECLICKTIME = 0x0020 + SPI_SETDOUBLECLKHEIGHT = 0x001E + SPI_SETDOUBLECLKWIDTH = 0x001D + SPI_SETGESTUREVISUALIZATION = 0x201B + SPI_SETKEYBOARDCUES = 0x100B + SPI_SETKEYBOARDDELAY = 0x0017 + SPI_SETKEYBOARDPREF = 0x0045 + SPI_SETKEYBOARDSPEED = 0x000B + SPI_SETLANGTOGGLE = 0x005B + SPI_SETMOUSE = 0x0004 + SPI_SETMOUSEBUTTONSWAP = 0x0021 + SPI_SETMOUSEHOVERHEIGHT = 0x0065 + SPI_SETMOUSEHOVERTIME = 0x0067 + SPI_SETMOUSEHOVERWIDTH = 0x0063 + SPI_SETMOUSESPEED = 0x0071 + SPI_SETMOUSETRAILS = 0x005D + SPI_SETMOUSEWHEELROUTING = 0x201D + SPI_SETPENVISUALIZATION = 0x201F + SPI_SETSNAPTODEFBUTTON = 0x0060 + SPI_SETSYSTEMLANGUAGEBAR = 0x1051 + SPI_SETTHREADLOCALINPUTSETTINGS = 0x104F + SPI_SETWHEELSCROLLCHARS = 0x006D + SPI_SETWHEELSCROLLLINES = 0x0069 + SPI_GETMENUDROPALIGNMENT = 0x001B + SPI_GETMENUFADE = 0x1012 + SPI_GETMENUSHOWDELAY = 0x006A + SPI_SETMENUDROPALIGNMENT = 0x001C + SPI_SETMENUFADE = 0x1013 + SPI_SETMENUSHOWDELAY = 0x006B + SPI_GETLOWPOWERACTIVE = 0x0053 + SPI_GETLOWPOWERTIMEOUT = 0x004F + SPI_GETPOWEROFFACTIVE = 0x0054 + SPI_GETPOWEROFFTIMEOUT = 0x0050 + SPI_SETLOWPOWERACTIVE = 0x0055 + SPI_SETLOWPOWERTIMEOUT = 0x0051 + SPI_SETPOWEROFFACTIVE = 0x0056 + SPI_SETPOWEROFFTIMEOUT = 0x0052 + SPI_GETSCREENSAVEACTIVE = 0x0010 + SPI_GETSCREENSAVERRUNNING = 0x0072 + SPI_GETSCREENSAVESECURE = 0x0076 + SPI_GETSCREENSAVETIMEOUT = 0x000E + SPI_SETSCREENSAVEACTIVE = 0x0011 + SPI_SETSCREENSAVESECURE = 0x0077 + SPI_SETSCREENSAVETIMEOUT = 0x000F + SPI_GETHUNGAPPTIMEOUT = 0x0078 + SPI_GETWAITTOKILLTIMEOUT = 0x007A + SPI_GETWAITTOKILLSERVICETIMEOUT = 0x007C + SPI_SETHUNGAPPTIMEOUT = 0x0079 + SPI_SETWAITTOKILLTIMEOUT = 0x007B + SPI_SETWAITTOKILLSERVICETIMEOUT = 0x007D + SPI_GETCOMBOBOXANIMATION = 0x1004 + SPI_GETCURSORSHADOW = 0x101A + SPI_GETGRADIENTCAPTIONS = 0x1008 + SPI_GETHOTTRACKING = 0x100E + SPI_GETLISTBOXSMOOTHSCROLLING = 0x1006 + SPI_GETMENUANIMATION = 0x1002 + SPI_GETMENUUNDERLINES = 0x100A + SPI_GETSELECTIONFADE = 0x1014 + SPI_GETTOOLTIPANIMATION = 0x1016 + SPI_GETTOOLTIPFADE = 0x1018 + SPI_GETUIEFFECTS = 0x103E + SPI_SETCOMBOBOXANIMATION = 0x1005 + SPI_SETCURSORSHADOW = 0x101B + SPI_SETGRADIENTCAPTIONS = 0x1009 + SPI_SETHOTTRACKING = 0x100F + SPI_SETLISTBOXSMOOTHSCROLLING = 0x1007 + SPI_SETMENUANIMATION = 0x1003 + SPI_SETMENUUNDERLINES = 0x100B + SPI_SETSELECTIONFADE = 0x1015 + SPI_SETTOOLTIPANIMATION = 0x1017 + SPI_SETTOOLTIPFADE = 0x1019 + SPI_SETUIEFFECTS = 0x103F + SPI_GETACTIVEWINDOWTRACKING = 0x1000 + SPI_GETACTIVEWNDTRKZORDER = 0x100C + SPI_GETACTIVEWNDTRKTIMEOUT = 0x2002 + SPI_GETANIMATION = 0x0048 + SPI_GETBORDER = 0x0005 + SPI_GETCARETWIDTH = 0x2006 + SPI_GETDOCKMOVING = 0x0090 + SPI_GETDRAGFROMMAXIMIZE = 0x008C + SPI_GETDRAGFULLWINDOWS = 0x0026 + SPI_GETFOREGROUNDFLASHCOUNT = 0x2004 + SPI_GETFOREGROUNDLOCKTIMEOUT = 0x2000 + SPI_GETMINIMIZEDMETRICS = 0x002B + SPI_GETMOUSEDOCKTHRESHOLD = 0x007E + SPI_GETMOUSEDRAGOUTTHRESHOLD = 0x0084 + SPI_GETMOUSESIDEMOVETHRESHOLD = 0x0088 + SPI_GETNONCLIENTMETRICS = 0x0029 + SPI_GETPENDOCKTHRESHOLD = 0x0080 + SPI_GETPENDRAGOUTTHRESHOLD = 0x0086 + SPI_GETPENSIDEMOVETHRESHOLD = 0x008A + SPI_GETSHOWIMEUI = 0x006E + SPI_GETSNAPSIZING = 0x008E + SPI_GETWINARRANGING = 0x0082 + SPI_SETACTIVEWINDOWTRACKING = 0x1001 + SPI_SETACTIVEWNDTRKZORDER = 0x100D + SPI_SETACTIVEWNDTRKTIMEOUT = 0x2003 + SPI_SETANIMATION = 0x0049 + SPI_SETBORDER = 0x0006 + SPI_SETCARETWIDTH = 0x2007 + SPI_SETDOCKMOVING = 0x0091 + SPI_SETDRAGFROMMAXIMIZE = 0x008D + SPI_SETDRAGFULLWINDOWS = 0x0025 + SPI_SETDRAGHEIGHT = 0x004D + SPI_SETDRAGWIDTH = 0x004C + SPI_SETFOREGROUNDFLASHCOUNT = 0x2005 + SPI_SETFOREGROUNDLOCKTIMEOUT = 0x2001 + SPI_SETMINIMIZEDMETRICS = 0x002C + SPI_SETMOUSEDOCKTHRESHOLD = 0x007F + SPI_SETMOUSEDRAGOUTTHRESHOLD = 0x0085 + SPI_SETMOUSESIDEMOVETHRESHOLD = 0x0089 + SPI_SETNONCLIENTMETRICS = 0x002A + SPI_SETPENDOCKTHRESHOLD = 0x0081 + SPI_SETPENDRAGOUTTHRESHOLD = 0x0087 + SPI_SETPENSIDEMOVETHRESHOLD = 0x008B + SPI_SETSHOWIMEUI = 0x006F + SPI_SETSNAPSIZING = 0x008F + SPI_SETWINARRANGING = 0x0083 +) + +const ( + SPIF_UPDATEINIFILE = 0x1 + SPIF_SENDCHANGE = 0x2 + SPIF_SENDWININICHANGE = SPIF_SENDCHANGE +) diff --git a/v3/internal/w32/functions.go b/v3/internal/w32/functions.go new file mode 100644 index 00000000..d521a339 --- /dev/null +++ b/v3/internal/w32/functions.go @@ -0,0 +1,4794 @@ +package w32 + +import ( + "errors" + "fmt" + "strconv" + "syscall" + "unsafe" +) + +var ( + user32 = syscall.NewLazyDLL("user32.dll") + advapi32 = syscall.NewLazyDLL("advapi32.dll") + comctl32 = syscall.NewLazyDLL("comctl32.dll") + comdlg32 = syscall.NewLazyDLL("comdlg32.dll") + dwmapi = syscall.NewLazyDLL("dwmapi.dll") + gdi32 = syscall.NewLazyDLL("gdi32.dll") + kernel32 = syscall.NewLazyDLL("kernel32.dll") + ole32 = syscall.NewLazyDLL("ole32.dll") + oleaut32 = syscall.NewLazyDLL("oleaut32") + opengl32 = syscall.NewLazyDLL("opengl32.dll") + psapi = syscall.NewLazyDLL("psapi.dll") + shell32 = syscall.NewLazyDLL("shell32.dll") + gdiplus = syscall.NewLazyDLL("gdiplus.dll") + version = syscall.NewLazyDLL("version.dll") + winmm = syscall.NewLazyDLL("winmm.dll") + dxva2 = syscall.NewLazyDLL("dxva2.dll") + msimg32 = syscall.NewLazyDLL("msimg32.dll") + mpr = syscall.NewLazyDLL("mpr.dll") + ntoskrnl = syscall.NewLazyDLL("ntoskrnl.exe") + ntdll = syscall.NewLazyDLL("ntdll.dll") + setupAPI = syscall.NewLazyDLL("SetupAPI.dll") + shcore = syscall.NewLazyDLL("Shcore.dll") + + registerClassEx = user32.NewProc("RegisterClassExW") + unregisterClass = user32.NewProc("UnregisterClassW") + getClassInfoEx = user32.NewProc("GetClassInfoExW") + loadIcon = user32.NewProc("LoadIconW") + loadCursor = user32.NewProc("LoadCursorW") + showWindow = user32.NewProc("ShowWindow") + showWindowAsync = user32.NewProc("ShowWindowAsync") + updateWindow = user32.NewProc("UpdateWindow") + createWindow = user32.NewProc("CreateWindowW") + createWindowEx = user32.NewProc("CreateWindowExW") + adjustWindowRect = user32.NewProc("AdjustWindowRect") + adjustWindowRectEx = user32.NewProc("AdjustWindowRectEx") + destroyWindow = user32.NewProc("DestroyWindow") + defWindowProc = user32.NewProc("DefWindowProcW") + defDlgProc = user32.NewProc("DefDlgProcW") + postQuitMessage = user32.NewProc("PostQuitMessage") + getMessage = user32.NewProc("GetMessageW") + getMessageTime = user32.NewProc("GetMessageTime") + translateMessage = user32.NewProc("TranslateMessage") + dispatchMessage = user32.NewProc("DispatchMessageW") + sendMessage = user32.NewProc("SendMessageW") + postMessage = user32.NewProc("PostMessageW") + waitMessage = user32.NewProc("WaitMessage") + setWindowText = user32.NewProc("SetWindowTextW") + getWindowTextLength = user32.NewProc("GetWindowTextLengthW") + getWindowText = user32.NewProc("GetWindowTextW") + getWindowRect = user32.NewProc("GetWindowRect") + getWindowInfo = user32.NewProc("GetWindowInfo") + moveWindow = user32.NewProc("MoveWindow") + screenToClient = user32.NewProc("ScreenToClient") + callWindowProc = user32.NewProc("CallWindowProcW") + setWindowLong = user32.NewProc("SetWindowLongW") + setWindowLongPtr = user32.NewProc("SetWindowLongPtrW") + setClassLongPtr = user32.NewProc("SetClassLongPtrW") + setClassLong = user32.NewProc("SetClassLongW") + getWindowLong = user32.NewProc("GetWindowLongW") + getWindowLongPtr = user32.NewProc("GetWindowLongPtrW") + getClassLongPtr = user32.NewProc("GetClassLongPtrW") + getClassLong = user32.NewProc("GetClassLongW") + enableWindow = user32.NewProc("EnableWindow") + isWindowEnabled = user32.NewProc("IsWindowEnabled") + isWindowVisible = user32.NewProc("IsWindowVisible") + setFocus = user32.NewProc("SetFocus") + invalidateRect = user32.NewProc("InvalidateRect") + validateRect = user32.NewProc("ValidateRect") + getClientRect = user32.NewProc("GetClientRect") + getDC = user32.NewProc("GetDC") + releaseDC = user32.NewProc("ReleaseDC") + setCapture = user32.NewProc("SetCapture") + releaseCapture = user32.NewProc("ReleaseCapture") + getWindowThreadProcessId = user32.NewProc("GetWindowThreadProcessId") + messageBox = user32.NewProc("MessageBoxW") + messageBoxIndirect = user32.NewProc("MessageBoxIndirectW") + getSystemMetrics = user32.NewProc("GetSystemMetrics") + copyRect = user32.NewProc("CopyRect") + equalRect = user32.NewProc("EqualRect") + inflateRect = user32.NewProc("InflateRect") + intersectRect = user32.NewProc("IntersectRect") + isRectEmpty = user32.NewProc("IsRectEmpty") + offsetRect = user32.NewProc("OffsetRect") + ptInRect = user32.NewProc("PtInRect") + setRect = user32.NewProc("SetRect") + setRectEmpty = user32.NewProc("SetRectEmpty") + subtractRect = user32.NewProc("SubtractRect") + unionRect = user32.NewProc("UnionRect") + createDialogParam = user32.NewProc("CreateDialogParamW") + dialogBoxParam = user32.NewProc("DialogBoxParamW") + getDlgItem = user32.NewProc("GetDlgItem") + drawIcon = user32.NewProc("DrawIcon") + drawIconEx = user32.NewProc("DrawIconEx") + clientToScreen = user32.NewProc("ClientToScreen") + isDialogMessage = user32.NewProc("IsDialogMessageW") + isWindow = user32.NewProc("IsWindow") + endDialog = user32.NewProc("EndDialog") + peekMessage = user32.NewProc("PeekMessageW") + createAcceleratorTable = user32.NewProc("CreateAcceleratorTableW") + destroyAcceleratorTable = user32.NewProc("DestroyAcceleratorTable") + translateAccelerator = user32.NewProc("TranslateAcceleratorW") + setWindowPos = user32.NewProc("SetWindowPos") + fillRect = user32.NewProc("FillRect") + drawText = user32.NewProc("DrawTextW") + addClipboardFormatListener = user32.NewProc("AddClipboardFormatListener") + removeClipboardFormatListener = user32.NewProc("RemoveClipboardFormatListener") + openClipboard = user32.NewProc("OpenClipboard") + closeClipboard = user32.NewProc("CloseClipboard") + enumClipboardFormats = user32.NewProc("EnumClipboardFormats") + getClipboardData = user32.NewProc("GetClipboardData") + setClipboardData = user32.NewProc("SetClipboardData") + emptyClipboard = user32.NewProc("EmptyClipboard") + getClipboardFormatName = user32.NewProc("GetClipboardFormatNameW") + isClipboardFormatAvailable = user32.NewProc("IsClipboardFormatAvailable") + beginPaint = user32.NewProc("BeginPaint") + endPaint = user32.NewProc("EndPaint") + getKeyboardState = user32.NewProc("GetKeyboardState") + mapVirtualKey = user32.NewProc("MapVirtualKeyW") + mapVirtualKeyEx = user32.NewProc("MapVirtualKeyExW") + getAsyncKeyState = user32.NewProc("GetAsyncKeyState") + toAscii = user32.NewProc("ToAscii") + swapMouseButton = user32.NewProc("SwapMouseButton") + getCursorPos = user32.NewProc("GetCursorPos") + setCursorPos = user32.NewProc("SetCursorPos") + setCursor = user32.NewProc("SetCursor") + createIcon = user32.NewProc("CreateIcon") + createIconFromResource = user32.NewProc("CreateIconFromResource") + createIconFromResourceEx = user32.NewProc("CreateIconFromResourceEx") + destroyIcon = user32.NewProc("DestroyIcon") + monitorFromPoint = user32.NewProc("MonitorFromPoint") + monitorFromRect = user32.NewProc("MonitorFromRect") + monitorFromWindow = user32.NewProc("MonitorFromWindow") + getMonitorInfo = user32.NewProc("GetMonitorInfoW") + enumDisplayMonitors = user32.NewProc("EnumDisplayMonitors") + enumDisplaySettingsEx = user32.NewProc("EnumDisplaySettingsExW") + changeDisplaySettingsEx = user32.NewProc("ChangeDisplaySettingsExW") + sendInput = user32.NewProc("SendInput") + setWindowsHookEx = user32.NewProc("SetWindowsHookExW") + unhookWindowsHookEx = user32.NewProc("UnhookWindowsHookEx") + callNextHookEx = user32.NewProc("CallNextHookEx") + getWindowPlacement = user32.NewProc("GetWindowPlacement") + setWindowPlacement = user32.NewProc("SetWindowPlacement") + showCursor = user32.NewProc("ShowCursor") + loadImage = user32.NewProc("LoadImageW") + getForegroundWindow = user32.NewProc("GetForegroundWindow") + findWindow = user32.NewProc("FindWindowW") + getClassName = user32.NewProc("GetClassNameW") + getDesktopWindow = user32.NewProc("GetDesktopWindow") + getRawInputData = user32.NewProc("GetRawInputData") + registerPowerSettingNotification = user32.NewProc("RegisterPowerSettingNotification") + registerRawInputDevices = user32.NewProc("RegisterRawInputDevices") + setTimer = user32.NewProc("SetTimer") + getActiveWindow = user32.NewProc("GetActiveWindow") + messageBeep = user32.NewProc("MessageBeep") + beep = kernel32.NewProc("Beep") + getCaretBlinkTime = user32.NewProc("GetCaretBlinkTime") + getWindowDC = user32.NewProc("GetWindowDC") + enumWindows = user32.NewProc("EnumWindows") + enumChildWindows = user32.NewProc("EnumChildWindows") + getTopWindow = user32.NewProc("GetTopWindow") + getWindow = user32.NewProc("GetWindow") + getKeyState = user32.NewProc("GetKeyState") + getSysColor = user32.NewProc("GetSysColor") + getSysColorBrush = user32.NewProc("GetSysColorBrush") + appendMenu = user32.NewProc("AppendMenuW") + checkMenuItem = user32.NewProc("CheckMenuItem") + checkMenuRadioItem = user32.NewProc("CheckMenuRadioItem") + createMenu = user32.NewProc("CreateMenu") + createPopupMenu = user32.NewProc("CreatePopupMenu") + deleteMenu = user32.NewProc("DeleteMenu") + destroyMenu = user32.NewProc("DestroyMenu") + drawMenuBar = user32.NewProc("DrawMenuBar") + enableMenuItem = user32.NewProc("EnableMenuItem") + endMenu = user32.NewProc("EndMenu") + getMenu = user32.NewProc("GetMenu") + getMenuBarInfo = user32.NewProc("GetMenuBarInfo") + getMenuCheckMarkDimensions = user32.NewProc("GetMenuCheckMarkDimensions") + getMenuDefaultItem = user32.NewProc("GetMenuDefaultItem") + getMenuInfo = user32.NewProc("GetMenuInfo") + getMenuItemCount = user32.NewProc("GetMenuItemCount") + getMenuItemID = user32.NewProc("GetMenuItemID") + getMenuItemInfo = user32.NewProc("GetMenuItemInfoW") + getMenuItemRect = user32.NewProc("GetMenuItemRect") + getMenuState = user32.NewProc("GetMenuState") + getMenuString = user32.NewProc("GetMenuStringW") + getSubMenu = user32.NewProc("GetSubMenu") + getSystemMenu = user32.NewProc("GetSystemMenu") + hiliteMenuItem = user32.NewProc("HiliteMenuItem") + insertMenu = user32.NewProc("InsertMenuW") + insertMenuItem = user32.NewProc("InsertMenuItemW") + isMenu = user32.NewProc("IsMenu") + loadMenu = user32.NewProc("LoadMenuW") + loadMenuIndirect = user32.NewProc("LoadMenuIndirectW") + menuItemFromPoint = user32.NewProc("MenuItemFromPoint") + modifyMenu = user32.NewProc("ModifyMenuW") + removeMenu = user32.NewProc("RemoveMenu") + setMenu = user32.NewProc("SetMenu") + setMenuDefaultItem = user32.NewProc("SetMenuDefaultItem") + setMenuInfo = user32.NewProc("SetMenuInfo") + setMenuItemBitmaps = user32.NewProc("SetMenuItemBitmaps") + setMenuItemInfo = user32.NewProc("SetMenuItemInfoW") + trackPopupMenu = user32.NewProc("TrackPopupMenu") + trackPopupMenuEx = user32.NewProc("TrackPopupMenuEx") + isDlgButtonChecked = user32.NewProc("IsDlgButtonChecked") + sendDlgItemMessage = user32.NewProc("SendDlgItemMessageW") + lookupIconIdFromDirectoryEx = user32.NewProc("LookupIconIdFromDirectoryEx") + setForegroundWindow = user32.NewProc("SetForegroundWindow") + scrollWindow = user32.NewProc("ScrollWindow") + getFocus = user32.NewProc("GetFocus") + printWindow = user32.NewProc("PrintWindow") + setLayeredWindowAttributes = user32.NewProc("SetLayeredWindowAttributes") + redrawWindow = user32.NewProc("RedrawWindow") + createCursor = user32.NewProc("CreateCursor") + destroyCursor = user32.NewProc("DestroyCursor") + getDlgCtrlID = user32.NewProc("GetDlgCtrlID") + systemParametersInfo = user32.NewProc("SystemParametersInfoW") + + regCreateKeyEx = advapi32.NewProc("RegCreateKeyExW") + regOpenKeyEx = advapi32.NewProc("RegOpenKeyExW") + regCloseKey = advapi32.NewProc("RegCloseKey") + regGetValue = advapi32.NewProc("RegGetValueW") + regEnumKeyEx = advapi32.NewProc("RegEnumKeyExW") + regEnumValue = advapi32.NewProc("RegEnumValueW") + regSetValueEx = advapi32.NewProc("RegSetValueExW") + regDeleteKeyValue = advapi32.NewProc("RegDeleteKeyValueW") + regDeleteValue = advapi32.NewProc("RegDeleteValueW") + regDeleteTree = advapi32.NewProc("RegDeleteTreeW") + openEventLog = advapi32.NewProc("OpenEventLogW") + getNumberOfEventLogRecords = advapi32.NewProc("GetNumberOfEventLogRecords") + readEventLog = advapi32.NewProc("ReadEventLogW") + closeEventLog = advapi32.NewProc("CloseEventLog") + openSCManager = advapi32.NewProc("OpenSCManagerW") + closeServiceHandle = advapi32.NewProc("CloseServiceHandle") + openService = advapi32.NewProc("OpenServiceW") + startService = advapi32.NewProc("StartServiceW") + controlService = advapi32.NewProc("ControlService") + + initCommonControlsEx = comctl32.NewProc("InitCommonControlsEx") + imageList_Create = comctl32.NewProc("ImageList_Create") + imageList_Destroy = comctl32.NewProc("ImageList_Destroy") + imageList_GetImageCount = comctl32.NewProc("ImageList_GetImageCount") + imageList_SetImageCount = comctl32.NewProc("ImageList_SetImageCount") + imageList_Add = comctl32.NewProc("ImageList_Add") + imageList_ReplaceIcon = comctl32.NewProc("ImageList_ReplaceIcon") + imageList_Remove = comctl32.NewProc("ImageList_Remove") + trackMouseEvent = comctl32.NewProc("_TrackMouseEvent") + setWindowSubclass = comctl32.NewProc("SetWindowSubclass") + defSubclassProc = comctl32.NewProc("DefSubclassProc") + + getSaveFileName = comdlg32.NewProc("GetSaveFileNameW") + getOpenFileName = comdlg32.NewProc("GetOpenFileNameW") + commDlgExtendedError = comdlg32.NewProc("CommDlgExtendedError") + + dwmDefWindowProc = dwmapi.NewProc("DwmDefWindowProc") + dwmEnableBlurBehindWindow = dwmapi.NewProc("DwmEnableBlurBehindWindow") + dwmEnableMMCSS = dwmapi.NewProc("DwmEnableMMCSS") + dwmExtendFrameIntoClientArea = dwmapi.NewProc("DwmExtendFrameIntoClientArea") + dwmFlush = dwmapi.NewProc("DwmFlush") + dwmGetColorizationColor = dwmapi.NewProc("DwmGetColorizationColor") + dwmGetCompositionTimingInfo = dwmapi.NewProc("DwmGetCompositionTimingInfo") + dwmGetTransportAttributes = dwmapi.NewProc("DwmGetTransportAttributes") + dwmGetWindowAttribute = dwmapi.NewProc("DwmGetWindowAttribute") + dwmInvalidateIconicBitmaps = dwmapi.NewProc("DwmInvalidateIconicBitmaps") + dwmIsCompositionEnabled = dwmapi.NewProc("DwmIsCompositionEnabled") + dwmModifyPreviousDxFrameDuration = dwmapi.NewProc("DwmModifyPreviousDxFrameDuration") + dwmQueryThumbnailSourceSize = dwmapi.NewProc("DwmQueryThumbnailSourceSize") + dwmRegisterThumbnail = dwmapi.NewProc("DwmRegisterThumbnail") + dwmRenderGesture = dwmapi.NewProc("DwmRenderGesture") + dwmSetDxFrameDuration = dwmapi.NewProc("DwmSetDxFrameDuration") + dwmSetIconicLivePreviewBitmap = dwmapi.NewProc("DwmSetIconicLivePreviewBitmap") + dwmSetIconicThumbnail = dwmapi.NewProc("DwmSetIconicThumbnail") + dwmSetPresentParameters = dwmapi.NewProc("DwmSetPresentParameters") + dwmSetWindowAttribute = dwmapi.NewProc("DwmSetWindowAttribute") + dwmShowContact = dwmapi.NewProc("DwmShowContact") + dwmTetherContact = dwmapi.NewProc("DwmTetherContact") + dwmTransitionOwnedWindow = dwmapi.NewProc("DwmTransitionOwnedWindow") + dwmUnregisterThumbnail = dwmapi.NewProc("DwmUnregisterThumbnail") + dwmUpdateThumbnailProperties = dwmapi.NewProc("DwmUpdateThumbnailProperties") + + getDeviceCaps = gdi32.NewProc("GetDeviceCaps") + deleteObject = gdi32.NewProc("DeleteObject") + createFontIndirect = gdi32.NewProc("CreateFontIndirectW") + abortDoc = gdi32.NewProc("AbortDoc") + bitBlt = gdi32.NewProc("BitBlt") + maskBlt = gdi32.NewProc("MaskBlt") + patBlt = gdi32.NewProc("PatBlt") + closeEnhMetaFile = gdi32.NewProc("CloseEnhMetaFile") + copyEnhMetaFile = gdi32.NewProc("CopyEnhMetaFileW") + createBrushIndirect = gdi32.NewProc("CreateBrushIndirect") + createCompatibleDC = gdi32.NewProc("CreateCompatibleDC") + createCompatibleBitmap = gdi32.NewProc("CreateCompatibleBitmap") + createBitmap = gdi32.NewProc("CreateBitmap") + createDC = gdi32.NewProc("CreateDCW") + createDIBSection = gdi32.NewProc("CreateDIBSection") + createEnhMetaFile = gdi32.NewProc("CreateEnhMetaFileW") + createIC = gdi32.NewProc("CreateICW") + deleteDC = gdi32.NewProc("DeleteDC") + deleteEnhMetaFile = gdi32.NewProc("DeleteEnhMetaFile") + ellipse = gdi32.NewProc("Ellipse") + endDoc = gdi32.NewProc("EndDoc") + endPage = gdi32.NewProc("EndPage") + extCreatePen = gdi32.NewProc("ExtCreatePen") + getEnhMetaFile = gdi32.NewProc("GetEnhMetaFileW") + getEnhMetaFileHeader = gdi32.NewProc("GetEnhMetaFileHeader") + getObject = gdi32.NewProc("GetObjectW") + getStockObject = gdi32.NewProc("GetStockObject") + getTextExtentExPoint = gdi32.NewProc("GetTextExtentExPointW") + getTextExtentPoint32 = gdi32.NewProc("GetTextExtentPoint32W") + getTextMetrics = gdi32.NewProc("GetTextMetricsW") + lineTo = gdi32.NewProc("LineTo") + moveToEx = gdi32.NewProc("MoveToEx") + playEnhMetaFile = gdi32.NewProc("PlayEnhMetaFile") + rectangle = gdi32.NewProc("Rectangle") + resetDC = gdi32.NewProc("ResetDCW") + selectObject = gdi32.NewProc("SelectObject") + setBkMode = gdi32.NewProc("SetBkMode") + setBrushOrgEx = gdi32.NewProc("SetBrushOrgEx") + setStretchBltMode = gdi32.NewProc("SetStretchBltMode") + setTextColor = gdi32.NewProc("SetTextColor") + setBkColor = gdi32.NewProc("SetBkColor") + startDoc = gdi32.NewProc("StartDocW") + startPage = gdi32.NewProc("StartPage") + stretchBlt = gdi32.NewProc("StretchBlt") + setDIBitsToDevice = gdi32.NewProc("SetDIBitsToDevice") + choosePixelFormat = gdi32.NewProc("ChoosePixelFormat") + describePixelFormat = gdi32.NewProc("DescribePixelFormat") + getEnhMetaFilePixelFormat = gdi32.NewProc("GetEnhMetaFilePixelFormat") + getPixelFormat = gdi32.NewProc("GetPixelFormat") + setPixelFormat = gdi32.NewProc("SetPixelFormat") + swapBuffers = gdi32.NewProc("SwapBuffers") + textOut = gdi32.NewProc("TextOutW") + createSolidBrush = gdi32.NewProc("CreateSolidBrush") + getDIBits = gdi32.NewProc("GetDIBits") + pie = gdi32.NewProc("Pie") + setDCPenColor = gdi32.NewProc("SetDCPenColor") + setDCBrushColor = gdi32.NewProc("SetDCBrushColor") + createPen = gdi32.NewProc("CreatePen") + arc = gdi32.NewProc("Arc") + arcTo = gdi32.NewProc("ArcTo") + angleArc = gdi32.NewProc("AngleArc") + chord = gdi32.NewProc("Chord") + polygon = gdi32.NewProc("Polygon") + polyline = gdi32.NewProc("Polyline") + polyBezier = gdi32.NewProc("PolyBezier") + intersectClipRect = gdi32.NewProc("IntersectClipRect") + selectClipRgn = gdi32.NewProc("SelectClipRgn") + createRectRgn = gdi32.NewProc("CreateRectRgn") + combineRgn = gdi32.NewProc("CombineRgn") + enumFontFamiliesEx = gdi32.NewProc("EnumFontFamiliesExW") + + getModuleHandle = kernel32.NewProc("GetModuleHandleW") + getModuleFileName = kernel32.NewProc("GetModuleFileNameW") + mulDiv = kernel32.NewProc("MulDiv") + getConsoleWindow = kernel32.NewProc("GetConsoleWindow") + getCurrentThread = kernel32.NewProc("GetCurrentThread") + getLogicalDrives = kernel32.NewProc("GetLogicalDrives") + getDriveType = kernel32.NewProc("GetDriveTypeW") + getUserDefaultLCID = kernel32.NewProc("GetUserDefaultLCID") + lstrlen = kernel32.NewProc("lstrlenW") + lstrcpy = kernel32.NewProc("lstrcpyW") + globalAlloc = kernel32.NewProc("GlobalAlloc") + globalFree = kernel32.NewProc("GlobalFree") + globalLock = kernel32.NewProc("GlobalLock") + globalUnlock = kernel32.NewProc("GlobalUnlock") + moveMemory = kernel32.NewProc("RtlMoveMemory") + findResource = kernel32.NewProc("FindResourceW") + sizeofResource = kernel32.NewProc("SizeofResource") + lockResource = kernel32.NewProc("LockResource") + loadResource = kernel32.NewProc("LoadResource") + getLastError = kernel32.NewProc("GetLastError") + openProcess = kernel32.NewProc("OpenProcess") + terminateProcess = kernel32.NewProc("TerminateProcess") + closeHandle = kernel32.NewProc("CloseHandle") + createToolhelp32Snapshot = kernel32.NewProc("CreateToolhelp32Snapshot") + module32First = kernel32.NewProc("Module32FirstW") + module32Next = kernel32.NewProc("Module32NextW") + getSystemTimes = kernel32.NewProc("GetSystemTimes") + getConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + setConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + getDiskFreeSpaceEx = kernel32.NewProc("GetDiskFreeSpaceExW") + getProcessTimes = kernel32.NewProc("GetProcessTimes") + setSystemTime = kernel32.NewProc("SetSystemTime") + setLocalTime = kernel32.NewProc("SetLocalTime") + getSystemTime = kernel32.NewProc("GetSystemTime") + getSystemTimeAsFileTime = kernel32.NewProc("GetSystemTimeAsFileTime") + systemTimeToFileTime = kernel32.NewProc("SystemTimeToFileTime") + fileTimeToSystemTime = kernel32.NewProc("FileTimeToSystemTime") + copyMemory = kernel32.NewProc("RtlCopyMemory") + getCurrentProcess = kernel32.NewProc("GetCurrentProcess") + getCurrentProcessId = kernel32.NewProc("GetCurrentProcessId") + getVersion = kernel32.NewProc("GetVersion") + setEnvironmentVariable = kernel32.NewProc("SetEnvironmentVariableW") + getComputerName = kernel32.NewProc("GetComputerNameW") + activateActCtx = kernel32.NewProc("ActivateActCtx") + createActCtx = kernel32.NewProc("CreateActCtxW") + getCurrentActCtx = kernel32.NewProc("GetCurrentActCtx") + setErrorMode = kernel32.NewProc("SetErrorMode") + createFile = kernel32.NewProc("CreateFileW") + deviceIoControl = kernel32.NewProc("DeviceIoControl") + findFirstStream = kernel32.NewProc("FindFirstStreamW") + findNextStream = kernel32.NewProc("FindNextStreamW") + findClose = kernel32.NewProc("FindClose") + openMutex = kernel32.NewProc("OpenMutexW") + createMutex = kernel32.NewProc("CreateMutexW") + getNativeSystemInfo = kernel32.NewProc("GetNativeSystemInfo") + + coInitializeEx = ole32.NewProc("CoInitializeEx") + coInitialize = ole32.NewProc("CoInitialize") + coUninitialize = ole32.NewProc("CoUninitialize") + createStreamOnHGlobal = ole32.NewProc("CreateStreamOnHGlobal") + + variantInit = oleaut32.NewProc("VariantInit") + sysAllocString = oleaut32.NewProc("SysAllocString") + sysFreeString = oleaut32.NewProc("SysFreeString") + sysStringLen = oleaut32.NewProc("SysStringLen") + createDispTypeInfo = oleaut32.NewProc("CreateDispTypeInfo") + createStdDispatch = oleaut32.NewProc("CreateStdDispatch") + + wglCreateContext = opengl32.NewProc("wglCreateContext") + wglCreateLayerContext = opengl32.NewProc("wglCreateLayerContext") + wglDeleteContext = opengl32.NewProc("wglDeleteContext") + wglGetProcAddress = opengl32.NewProc("wglGetProcAddress") + wglMakeCurrent = opengl32.NewProc("wglMakeCurrent") + wglShareLists = opengl32.NewProc("wglShareLists") + + enumProcesses = psapi.NewProc("EnumProcesses") + + sHBrowseForFolder = shell32.NewProc("SHBrowseForFolderW") + sHGetPathFromIDList = shell32.NewProc("SHGetPathFromIDListW") + shGetSpecialFolderPath = shell32.NewProc("SHGetSpecialFolderPathW") + dragAcceptFiles = shell32.NewProc("DragAcceptFiles") + dragQueryFile = shell32.NewProc("DragQueryFileW") + dragQueryPoint = shell32.NewProc("DragQueryPoint") + dragFinish = shell32.NewProc("DragFinish") + shellExecute = shell32.NewProc("ShellExecuteW") + extractIcon = shell32.NewProc("ExtractIconW") + + gdipCreateBitmapFromFile = gdiplus.NewProc("GdipCreateBitmapFromFile") + gdipCreateBitmapFromHBITMAP = gdiplus.NewProc("GdipCreateBitmapFromHBITMAP") + gdipCreateHBITMAPFromBitmap = gdiplus.NewProc("GdipCreateHBITMAPFromBitmap") + gdipCreateBitmapFromResource = gdiplus.NewProc("GdipCreateBitmapFromResource") + gdipCreateBitmapFromStream = gdiplus.NewProc("GdipCreateBitmapFromStream") + gdipDisposeImage = gdiplus.NewProc("GdipDisposeImage") + gdiplusShutdown = gdiplus.NewProc("GdiplusShutdown") + gdiplusStartup = gdiplus.NewProc("GdiplusStartup") + + getFileVersionInfoSize = version.NewProc("GetFileVersionInfoSizeW") + getFileVersionInfo = version.NewProc("GetFileVersionInfoW") + verQueryValue = version.NewProc("VerQueryValueW") + + playSound = winmm.NewProc("PlaySoundW") + + getMonitorBrightness = dxva2.NewProc("GetMonitorBrightness") + setMonitorBrightness = dxva2.NewProc("SetMonitorBrightness") + getNumberOfPhysicalMonitorsFromHMONITOR = dxva2.NewProc("GetNumberOfPhysicalMonitorsFromHMONITOR") + getPhysicalMonitorsFromHMONITOR = dxva2.NewProc("GetPhysicalMonitorsFromHMONITOR") + + alphaBlend = msimg32.NewProc("AlphaBlend") + + wNetAddConnection2 = mpr.NewProc("WNetAddConnection2W") + wNetAddConnection3 = mpr.NewProc("WNetAddConnection3W") + wNetCancelConnection2 = mpr.NewProc("WNetCancelConnection2W") + + rtlGetVersion = ntdll.NewProc("RtlGetVersion") + + setupDiGetClassDevs = setupAPI.NewProc("SetupDiGetClassDevsW") + setupDiDestroyDeviceInfoList = setupAPI.NewProc("SetupDiDestroyDeviceInfoList") + setupDiEnumDeviceInfo = setupAPI.NewProc("SetupDiEnumDeviceInfo") + setupDiOpenDevRegKey = setupAPI.NewProc("SetupDiOpenDevRegKey") + + setProcessDpiAwareness = shcore.NewProc("SetProcessDpiAwareness") +) + +// RegisterClassEx sets the Size of the WNDCLASSEX automatically. +func RegisterClassEx(wndClassEx *WNDCLASSEX) ATOM { + if wndClassEx != nil { + wndClassEx.Size = uint32(unsafe.Sizeof(*wndClassEx)) + } + ret, _, _ := registerClassEx.Call(uintptr(unsafe.Pointer(wndClassEx))) + return ATOM(ret) +} + +func UnregisterClass(className string, instance HINSTANCE) bool { + ret, _, _ := unregisterClass.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(className))), + uintptr(instance), + ) + return ret != 0 +} + +func UnregisterClassAtom(atom ATOM, instance HINSTANCE) bool { + ret, _, _ := unregisterClass.Call( + uintptr(atom), + uintptr(instance), + ) + return ret != 0 +} + +func GetClassInfoEx(inst HINSTANCE, className string) (c WNDCLASSEX, found bool) { + ret, _, _ := getClassInfoEx.Call( + uintptr(inst), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(className))), + uintptr(unsafe.Pointer(&c)), + ) + found = ret != 0 + return +} + +func LoadIcon(instance HINSTANCE, iconName *uint16) HICON { + ret, _, _ := loadIcon.Call( + uintptr(instance), + uintptr(unsafe.Pointer(iconName)), + ) + return HICON(ret) +} + +func LoadIconWithResourceID(instance HINSTANCE, res uint16) HICON { + ret, _, _ := loadIcon.Call( + uintptr(instance), + uintptr(res)) + + return HICON(ret) +} + +func LoadCursor(instance HINSTANCE, cursorName *uint16) HCURSOR { + ret, _, _ := loadCursor.Call( + uintptr(instance), + uintptr(unsafe.Pointer(cursorName)), + ) + return HCURSOR(ret) +} + +func LoadCursorWithResourceID(instance HINSTANCE, res uint16) HCURSOR { + ret, _, _ := loadCursor.Call( + uintptr(instance), + uintptr(res)) + + return HCURSOR(ret) +} + +func ShowWindow(hwnd HWND, cmdshow int) bool { + ret, _, _ := showWindow.Call( + uintptr(hwnd), + uintptr(cmdshow), + ) + return ret != 0 +} + +func ShowWindowAsync(hwnd HWND, cmdshow int) bool { + ret, _, _ := showWindowAsync.Call( + uintptr(hwnd), + uintptr(cmdshow), + ) + return ret != 0 +} + +func UpdateWindow(hwnd HWND) bool { + ret, _, _ := updateWindow.Call(uintptr(hwnd)) + return ret != 0 +} + +func CreateWindow(className, windowName *uint16, + style uint, x, y, width, height int, parent HWND, menu HMENU, + instance HINSTANCE, param unsafe.Pointer) HWND { + return CreateWindowEx( + 0, + className, windowName, + style, + x, y, width, height, + parent, menu, instance, param, + ) +} + +func CreateWindowStr(className, windowName string, + style uint, x, y, width, height int, parent HWND, menu HMENU, + instance HINSTANCE, param unsafe.Pointer) HWND { + return CreateWindow( + syscall.StringToUTF16Ptr(className), + syscall.StringToUTF16Ptr(windowName), + style, + x, y, width, height, + parent, menu, instance, param, + ) +} + +func CreateWindowEx(exStyle uint, className, windowName *uint16, + style uint, x, y, width, height int, parent HWND, menu HMENU, + instance HINSTANCE, param unsafe.Pointer) HWND { + ret, _, _ := createWindowEx.Call( + uintptr(exStyle), + uintptr(unsafe.Pointer(className)), + uintptr(unsafe.Pointer(windowName)), + uintptr(style), + uintptr(x), + uintptr(y), + uintptr(width), + uintptr(height), + uintptr(parent), + uintptr(menu), + uintptr(instance), + uintptr(param), + ) + return HWND(ret) +} + +func CreateWindowExStr(exStyle uint, className, windowName string, + style uint, x, y, width, height int, parent HWND, menu HMENU, + instance HINSTANCE, param unsafe.Pointer) HWND { + return CreateWindowEx( + exStyle, + syscall.StringToUTF16Ptr(className), + syscall.StringToUTF16Ptr(windowName), + style, + x, y, width, height, + parent, menu, instance, param, + ) +} + +func AdjustWindowRectEx(rect *RECT, style uint, menu bool, exStyle uint) bool { + ret, _, _ := adjustWindowRectEx.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(style), + uintptr(BoolToBOOL(menu)), + uintptr(exStyle), + ) + return ret != 0 +} + +func AdjustWindowRect(rect *RECT, style uint, menu bool) bool { + ret, _, _ := adjustWindowRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(style), + uintptr(BoolToBOOL(menu)), + ) + return ret != 0 +} + +func DestroyWindow(hwnd HWND) bool { + ret, _, _ := destroyWindow.Call(uintptr(hwnd)) + return ret != 0 +} + +func DefWindowProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := defWindowProc.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + ) + return ret +} + +func DefDlgProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := defDlgProc.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + ) + return ret +} + +func PostQuitMessage(exitCode int) { + postQuitMessage.Call(uintptr(exitCode)) +} + +func GetMessage(msg *MSG, hwnd HWND, msgFilterMin, msgFilterMax uint32) int { + ret, _, _ := getMessage.Call( + uintptr(unsafe.Pointer(msg)), + uintptr(hwnd), + uintptr(msgFilterMin), + uintptr(msgFilterMax), + ) + return int(ret) +} + +func GetMessageTime() int { + ret, _, _ := getMessageTime.Call() + return int(ret) +} + +func TranslateMessage(msg *MSG) bool { + ret, _, _ := translateMessage.Call(uintptr(unsafe.Pointer(msg))) + return ret != 0 + +} + +func DispatchMessage(msg *MSG) uintptr { + ret, _, _ := dispatchMessage.Call(uintptr(unsafe.Pointer(msg))) + return ret + +} + +func SendMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := sendMessage.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + ) + return ret +} + +func PostMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) bool { + ret, _, _ := postMessage.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + ) + return ret != 0 +} + +func WaitMessage() bool { + ret, _, _ := waitMessage.Call() + return ret != 0 +} + +func SetWindowText(hwnd HWND, text string) { + setWindowText.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + ) +} + +func GetWindowTextLength(hwnd HWND) int { + ret, _, _ := getWindowTextLength.Call(uintptr(hwnd)) + return int(ret) +} + +func GetWindowText(hwnd HWND) string { + textLen := GetWindowTextLength(hwnd) + 1 + buf := make([]uint16, textLen) + len, _, _ := getWindowText.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(textLen), + ) + return syscall.UTF16ToString(buf[:len]) +} + +func GetWindowRect(hwnd HWND) *RECT { + var rect RECT + getWindowRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&rect)), + ) + return &rect +} + +func GetWindowInfo(hwnd HWND) (WINDOWINFO, bool) { + var wi WINDOWINFO + ret, _, _ := getWindowInfo.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&wi)), + ) + return wi, ret != 0 +} + +func MoveWindow(hwnd HWND, x, y, width, height int, repaint bool) bool { + ret, _, _ := moveWindow.Call( + uintptr(hwnd), + uintptr(x), + uintptr(y), + uintptr(width), + uintptr(height), + uintptr(BoolToBOOL(repaint)), + ) + return ret != 0 + +} + +func ScreenToClient(hwnd HWND, x, y int) (X, Y int, ok bool) { + pt := POINT{X: int32(x), Y: int32(y)} + ret, _, _ := screenToClient.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&pt)), + ) + return int(pt.X), int(pt.Y), ret != 0 +} + +func CallWindowProc(preWndProc uintptr, hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := callWindowProc.Call( + preWndProc, + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + ) + return ret +} + +func GetWindowLong(hwnd HWND, index int) int32 { + ret, _, _ := getWindowLong.Call( + uintptr(hwnd), + uintptr(index), + ) + return int32(ret) +} + +func SetWindowLong(hwnd HWND, index int, value int32) int32 { + ret, _, _ := setWindowLong.Call( + uintptr(hwnd), + uintptr(index), + uintptr(value), + ) + return int32(ret) +} + +func GetClassLong(hwnd HWND, index int) uint32 { + ret, _, _ := getClassLong.Call( + uintptr(hwnd), + uintptr(index), + ) + return uint32(ret) +} + +func SetClassLong(hwnd HWND, index int, value int32) uint32 { + ret, _, _ := setClassLong.Call( + uintptr(hwnd), + uintptr(index), + uintptr(value), + ) + return uint32(ret) +} + +func EnableWindow(hwnd HWND, b bool) bool { + ret, _, _ := enableWindow.Call( + uintptr(hwnd), + uintptr(BoolToBOOL(b)), + ) + return ret != 0 +} + +func IsWindowEnabled(hwnd HWND) bool { + ret, _, _ := isWindowEnabled.Call(uintptr(hwnd)) + return ret != 0 +} + +func IsWindowVisible(hwnd HWND) bool { + ret, _, _ := isWindowVisible.Call(uintptr(hwnd)) + return ret != 0 +} + +func SetFocus(hwnd HWND) HWND { + ret, _, _ := setFocus.Call(uintptr(hwnd)) + return HWND(ret) +} + +func InvalidateRect(hwnd HWND, rect *RECT, erase bool) bool { + ret, _, _ := invalidateRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(rect)), + uintptr(BoolToBOOL(erase)), + ) + return ret != 0 +} + +func ValidateRect(hwnd HWND, rect *RECT) bool { + ret, _, _ := validateRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(rect)), + ) + return ret != 0 +} + +func GetClientRect(hwnd HWND) *RECT { + var rect RECT + ret, _, _ := getClientRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&rect))) + if ret == 0 { + return nil + } + return &rect +} + +func GetDC(hwnd HWND) HDC { + ret, _, _ := getDC.Call(uintptr(hwnd)) + return HDC(ret) +} + +func ReleaseDC(hwnd HWND, hDC HDC) bool { + ret, _, _ := releaseDC.Call( + uintptr(hwnd), + uintptr(hDC), + ) + return ret != 0 +} + +func SetCapture(hwnd HWND) HWND { + ret, _, _ := setCapture.Call(uintptr(hwnd)) + return HWND(ret) +} + +func ReleaseCapture() bool { + ret, _, _ := releaseCapture.Call() + return ret != 0 +} + +func GetWindowThreadProcessId(hwnd HWND) (HANDLE, DWORD) { + var processId DWORD + ret, _, _ := getWindowThreadProcessId.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&processId)), + ) + return HANDLE(ret), processId +} + +func MessageBox(hwnd HWND, text, caption string, flags uint) int { + ret, _, _ := messageBox.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), + uintptr(flags), + ) + return int(ret) +} + +func MessageBoxIndirect(params *MSGBOXPARAMS) int { + if params != nil { + params.Size = uint32(unsafe.Sizeof(*params)) + } + ret, _, _ := messageBoxIndirect.Call(uintptr(unsafe.Pointer(params))) + return int(ret) +} + +func GetSystemMetrics(index int) int { + ret, _, _ := getSystemMetrics.Call(uintptr(index)) + return int(ret) +} + +func CopyRect(dst, src *RECT) bool { + ret, _, _ := copyRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src)), + ) + return ret != 0 +} + +func EqualRect(rect1, rect2 *RECT) bool { + ret, _, _ := equalRect.Call( + uintptr(unsafe.Pointer(rect1)), + uintptr(unsafe.Pointer(rect2)), + ) + return ret != 0 +} + +func InflateRect(rect *RECT, dx, dy int) bool { + ret, _, _ := inflateRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(dx), + uintptr(dy), + ) + return ret != 0 +} + +func IntersectRect(dst, src1, src2 *RECT) bool { + ret, _, _ := intersectRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2)), + ) + return ret != 0 +} + +func IsRectEmpty(rect *RECT) bool { + ret, _, _ := isRectEmpty.Call(uintptr(unsafe.Pointer(rect))) + return ret != 0 +} + +func OffsetRect(rect *RECT, dx, dy int) bool { + ret, _, _ := offsetRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(dx), + uintptr(dy), + ) + return ret != 0 +} + +func PtInRect(rect *RECT, x, y int) bool { + pt := POINT{X: int32(x), Y: int32(y)} + ret, _, _ := ptInRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(unsafe.Pointer(&pt)), + ) + return ret != 0 +} + +func SetRect(rect *RECT, left, top, right, bottom int) bool { + ret, _, _ := setRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(left), + uintptr(top), + uintptr(right), + uintptr(bottom), + ) + return ret != 0 +} + +func SetRectEmpty(rect *RECT) bool { + ret, _, _ := setRectEmpty.Call(uintptr(unsafe.Pointer(rect))) + return ret != 0 +} + +func SubtractRect(dst, src1, src2 *RECT) bool { + ret, _, _ := subtractRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2)), + ) + return ret != 0 +} + +func UnionRect(dst, src1, src2 *RECT) bool { + ret, _, _ := unionRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2)), + ) + return ret != 0 +} + +func CreateDialog(hInstance HINSTANCE, lpTemplate *uint16, hWndParent HWND, lpDialogProc uintptr) HWND { + ret, _, _ := createDialogParam.Call( + uintptr(hInstance), + uintptr(unsafe.Pointer(lpTemplate)), + uintptr(hWndParent), + lpDialogProc, + 0, + ) + return HWND(ret) +} + +func DialogBox(hInstance HINSTANCE, lpTemplateName *uint16, hWndParent HWND, lpDialogProc uintptr) int { + ret, _, _ := dialogBoxParam.Call( + uintptr(hInstance), + uintptr(unsafe.Pointer(lpTemplateName)), + uintptr(hWndParent), + lpDialogProc, + 0, + ) + return int(ret) +} + +func GetDlgItem(hDlg HWND, nIDDlgItem int) HWND { + ret, _, _ := getDlgItem.Call( + uintptr(unsafe.Pointer(hDlg)), + uintptr(nIDDlgItem), + ) + return HWND(ret) +} + +func DrawIconEx( + hDC HDC, x, y int, hIcon HICON, width, height int, + frame uint, flickerFreeDraw HBRUSH, flags uint, +) bool { + ret, _, _ := drawIconEx.Call( + uintptr(unsafe.Pointer(hDC)), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(hIcon)), + uintptr(width), + uintptr(height), + uintptr(frame), + uintptr(flickerFreeDraw), + uintptr(flags), + ) + return ret != 0 +} + +func DrawIcon(hDC HDC, x, y int, hIcon HICON) bool { + ret, _, _ := drawIcon.Call( + uintptr(unsafe.Pointer(hDC)), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(hIcon)), + ) + return ret != 0 +} + +func ClientToScreen(hwnd HWND, x, y int) (int, int) { + pt := POINT{X: int32(x), Y: int32(y)} + clientToScreen.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&pt)), + ) + return int(pt.X), int(pt.Y) +} + +func IsDialogMessage(hwnd HWND, msg *MSG) bool { + ret, _, _ := isDialogMessage.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(msg)), + ) + return ret != 0 +} + +func IsWindow(hwnd HWND) bool { + ret, _, _ := isWindow.Call(uintptr(hwnd)) + return ret != 0 +} + +func EndDialog(hwnd HWND, nResult uintptr) bool { + ret, _, _ := endDialog.Call( + uintptr(hwnd), + nResult, + ) + return ret != 0 +} + +func PeekMessage(lpMsg *MSG, hwnd HWND, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool { + ret, _, _ := peekMessage.Call( + uintptr(unsafe.Pointer(lpMsg)), + uintptr(hwnd), + uintptr(wMsgFilterMin), + uintptr(wMsgFilterMax), + uintptr(wRemoveMsg), + ) + return ret != 0 +} + +func CreateAcceleratorTable(acc []ACCEL) HACCEL { + if len(acc) == 0 { + return 0 + } + ret, _, _ := createAcceleratorTable.Call( + uintptr(unsafe.Pointer(&acc[0])), + uintptr(len(acc)), + ) + return HACCEL(ret) +} + +func DestroyAcceleratorTable(acc HACCEL) bool { + ret, _, _ := destroyAcceleratorTable.Call(uintptr(acc)) + return ret != 0 +} + +func TranslateAccelerator(hwnd HWND, hAccTable HACCEL, lpMsg *MSG) bool { + ret, _, _ := translateAccelerator.Call( + uintptr(hwnd), + uintptr(hAccTable), + uintptr(unsafe.Pointer(lpMsg)), + ) + return ret != 0 +} + +func SetWindowPos(hwnd, hWndInsertAfter HWND, x, y, cx, cy int, uFlags uint) bool { + ret, _, _ := setWindowPos.Call( + uintptr(hwnd), + uintptr(hWndInsertAfter), + uintptr(x), + uintptr(y), + uintptr(cx), + uintptr(cy), + uintptr(uFlags), + ) + return ret != 0 +} + +func FillRect(hDC HDC, lprc *RECT, hbr HBRUSH) bool { + ret, _, _ := fillRect.Call( + uintptr(hDC), + uintptr(unsafe.Pointer(lprc)), + uintptr(hbr), + ) + return ret != 0 +} + +// DrawText does not support DT_MODIFYSTRING in this implementation. +func DrawText(hDC HDC, text string, lpRect *RECT, uFormat uint) int { + // suppress DT_MODIFYSTRING because the given text is not a pointer and we + // do not return any text changes. + mod := uint(DT_MODIFYSTRING) + uFormat = uFormat & ^mod + count := -1 // because the text pointer is NULL terminated + ret, _, _ := drawText.Call( + uintptr(hDC), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + uintptr(count), + uintptr(unsafe.Pointer(lpRect)), + uintptr(uFormat), + ) + return int(ret) +} + +func AddClipboardFormatListener(hwnd HWND) bool { + ret, _, _ := addClipboardFormatListener.Call(uintptr(hwnd)) + return ret != 0 +} + +func RemoveClipboardFormatListener(hwnd HWND) bool { + ret, _, _ := removeClipboardFormatListener.Call(uintptr(hwnd)) + return ret != 0 +} + +func OpenClipboard(hWndNewOwner HWND) bool { + ret, _, _ := openClipboard.Call(uintptr(hWndNewOwner)) + return ret != 0 +} + +func CloseClipboard() bool { + ret, _, _ := closeClipboard.Call() + return ret != 0 +} + +func EnumClipboardFormats(format uint) uint { + ret, _, _ := enumClipboardFormats.Call(uintptr(format)) + return uint(ret) +} + +func GetClipboardData(uFormat uint) HANDLE { + ret, _, _ := getClipboardData.Call(uintptr(uFormat)) + return HANDLE(ret) +} + +func SetClipboardData(uFormat uint, hMem HANDLE) HANDLE { + ret, _, _ := setClipboardData.Call( + uintptr(uFormat), + uintptr(hMem), + ) + return HANDLE(ret) +} + +func EmptyClipboard() bool { + ret, _, _ := emptyClipboard.Call() + return ret != 0 +} + +func GetClipboardFormatName(format uint) (string, bool) { + cchMaxCount := 255 + buf := make([]uint16, cchMaxCount) + ret, _, _ := getClipboardFormatName.Call( + uintptr(format), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(cchMaxCount)) + + if ret > 0 { + return syscall.UTF16ToString(buf), true + } + + return "Requested format does not exist or is predefined", false +} + +func IsClipboardFormatAvailable(format uint) bool { + ret, _, _ := isClipboardFormatAvailable.Call(uintptr(format)) + return ret != 0 +} + +func BeginPaint(hwnd HWND, paint *PAINTSTRUCT) HDC { + ret, _, _ := beginPaint.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(paint)), + ) + return HDC(ret) +} + +func EndPaint(hwnd HWND, paint *PAINTSTRUCT) { + endPaint.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(paint)), + ) +} + +func GetKeyboardState(keyState []byte) bool { + if len(keyState) < 256 { + return false + } + ret, _, _ := getKeyboardState.Call(uintptr(unsafe.Pointer(&keyState[0]))) + return ret != 0 +} + +func MapVirtualKey(uCode, uMapType uint) uint { + ret, _, _ := mapVirtualKey.Call( + uintptr(uCode), + uintptr(uMapType), + ) + return uint(ret) +} + +func MapVirtualKeyEx(uCode, uMapType uint, dwhkl HKL) uint { + ret, _, _ := mapVirtualKeyEx.Call( + uintptr(uCode), + uintptr(uMapType), + uintptr(dwhkl), + ) + return uint(ret) +} + +func GetAsyncKeyState(vKey int) uint16 { + ret, _, _ := getAsyncKeyState.Call(uintptr(vKey)) + return uint16(ret) +} + +func ToAscii(uVirtKey, uScanCode uint, lpKeyState *byte, lpChar *uint16, uFlags uint) int { + ret, _, _ := toAscii.Call( + uintptr(uVirtKey), + uintptr(uScanCode), + uintptr(unsafe.Pointer(lpKeyState)), + uintptr(unsafe.Pointer(lpChar)), + uintptr(uFlags), + ) + return int(ret) +} + +func SwapMouseButton(fSwap bool) bool { + ret, _, _ := swapMouseButton.Call(uintptr(BoolToBOOL(fSwap))) + return ret != 0 +} + +func GetCursorPos() (x, y int, ok bool) { + var pt POINT + ret, _, _ := getCursorPos.Call(uintptr(unsafe.Pointer(&pt))) + return int(pt.X), int(pt.Y), ret != 0 +} + +func SetCursorPos(x, y int) bool { + ret, _, _ := setCursorPos.Call( + uintptr(x), + uintptr(y), + ) + return ret != 0 +} + +func SetCursor(cursor HCURSOR) HCURSOR { + ret, _, _ := setCursor.Call(uintptr(cursor)) + return HCURSOR(ret) +} + +func CreateIcon(instance HINSTANCE, nWidth, nHeight int, cPlanes, cBitsPerPixel byte, ANDbits, XORbits *byte) HICON { + ret, _, _ := createIcon.Call( + uintptr(instance), + uintptr(nWidth), + uintptr(nHeight), + uintptr(cPlanes), + uintptr(cBitsPerPixel), + uintptr(unsafe.Pointer(ANDbits)), + uintptr(unsafe.Pointer(XORbits)), + ) + return HICON(ret) +} + +func CreateIconFromResource( + mem unsafe.Pointer, + memSize uint32, + icon bool, + version uint32, +) HICON { + ret, _, _ := createIconFromResource.Call( + uintptr(mem), + uintptr(memSize), + uintptr(BoolToBOOL(icon)), + uintptr(version), + ) + return HICON(ret) +} + +func CreateIconFromResourceEx( + mem unsafe.Pointer, + memSize uint32, + icon bool, + version uint32, + width int, + height int, + flags uint, +) HICON { + ret, _, _ := createIconFromResourceEx.Call( + uintptr(mem), + uintptr(memSize), + uintptr(BoolToBOOL(icon)), + uintptr(version), + uintptr(width), + uintptr(height), + uintptr(flags), + ) + return HICON(ret) +} + +func DestroyIcon(icon HICON) bool { + ret, _, _ := destroyIcon.Call(uintptr(icon)) + return ret != 0 +} + +func MonitorFromPoint(x, y int, dwFlags uint32) HMONITOR { + ret, _, _ := monitorFromPoint.Call( + uintptr(x), + uintptr(y), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +func MonitorFromRect(rc *RECT, dwFlags uint32) HMONITOR { + ret, _, _ := monitorFromRect.Call( + uintptr(unsafe.Pointer(rc)), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +func MonitorFromWindow(hwnd HWND, dwFlags uint32) HMONITOR { + ret, _, _ := monitorFromWindow.Call( + uintptr(hwnd), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +// GetMonitorInfo automatically sets the MONITORINFO's CbSize field. +func GetMonitorInfo(hMonitor HMONITOR, lmpi *MONITORINFO) bool { + if lmpi != nil { + lmpi.CbSize = uint32(unsafe.Sizeof(*lmpi)) + } + ret, _, _ := getMonitorInfo.Call( + uintptr(hMonitor), + uintptr(unsafe.Pointer(lmpi)), + ) + return ret != 0 +} + +func EnumDisplayMonitors(hdc HDC, clip *RECT, fnEnum, dwData uintptr) bool { + ret, _, _ := enumDisplayMonitors.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(clip)), + fnEnum, + dwData, + ) + return ret != 0 +} + +func EnumDisplaySettingsEx(szDeviceName *uint16, iModeNum uint32, devMode *DEVMODE, dwFlags uint32) bool { + ret, _, _ := enumDisplaySettingsEx.Call( + uintptr(unsafe.Pointer(szDeviceName)), + uintptr(iModeNum), + uintptr(unsafe.Pointer(devMode)), + uintptr(dwFlags), + ) + return ret != 0 +} + +func ChangeDisplaySettingsEx(szDeviceName *uint16, devMode *DEVMODE, hwnd HWND, dwFlags uint32, lParam uintptr) int32 { + ret, _, _ := changeDisplaySettingsEx.Call( + uintptr(unsafe.Pointer(szDeviceName)), + uintptr(unsafe.Pointer(devMode)), + uintptr(hwnd), + uintptr(dwFlags), + lParam, + ) + return int32(ret) +} + +func SendInput(inputs ...INPUT) uint32 { + if len(inputs) == 0 { + return 0 + } + ret, _, _ := sendInput.Call( + uintptr(len(inputs)), + uintptr(unsafe.Pointer(&inputs[0])), + unsafe.Sizeof(inputs[0]), + ) + return uint32(ret) +} + +func SetWindowsHookEx(idHook int, lpfn HOOKPROC, hMod HINSTANCE, dwThreadId DWORD) HHOOK { + ret, _, _ := setWindowsHookEx.Call( + uintptr(idHook), + uintptr(syscall.NewCallback(lpfn)), + uintptr(hMod), + uintptr(dwThreadId), + ) + return HHOOK(ret) +} + +func UnhookWindowsHookEx(hhk HHOOK) bool { + ret, _, _ := unhookWindowsHookEx.Call(uintptr(hhk)) + return ret != 0 +} + +func CallNextHookEx(hhk HHOOK, nCode int, wParam WPARAM, lParam LPARAM) LRESULT { + ret, _, _ := callNextHookEx.Call( + uintptr(hhk), + uintptr(nCode), + uintptr(wParam), + uintptr(lParam), + ) + return LRESULT(ret) +} + +// GetWindowPlacement automatically sets the WINDOWPLACEMENT's Length field. +func GetWindowPlacement(hwnd HWND, placement *WINDOWPLACEMENT) bool { + if placement != nil { + placement.Length = uint32(unsafe.Sizeof(*placement)) + } + ret, _, _ := getWindowPlacement.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(placement)), + ) + return ret != 0 +} + +func SetWindowPlacement(hwnd HWND, placement *WINDOWPLACEMENT) bool { + ret, _, _ := setWindowPlacement.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(placement)), + ) + return ret != 0 +} + +func ShowCursor(show bool) int { + ret, _, _ := showCursor.Call(uintptr(BoolToBOOL(show))) + return int(int32(ret)) +} + +func LoadImage( + inst HINSTANCE, + name *uint16, + typ uint, + desiredWidth, desiredHeight int, + load uint, +) HANDLE { + ret, _, _ := loadImage.Call( + uintptr(inst), + uintptr(unsafe.Pointer(name)), + uintptr(typ), + uintptr(desiredWidth), + uintptr(desiredHeight), + uintptr(load), + ) + return HANDLE(ret) +} + +func GetForegroundWindow() HWND { + ret, _, _ := getForegroundWindow.Call() + return HWND(ret) +} + +func FindWindow(className, windowName string) HWND { + var class, window uintptr + if className != "" { + class = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(className))) + } + if windowName != "" { + window = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(windowName))) + } + ret, _, _ := findWindow.Call(class, window) + return HWND(ret) +} + +func GetClassName(window HWND) (string, bool) { + var output [256]uint16 + ret, _, _ := getClassName.Call( + uintptr(window), + uintptr(unsafe.Pointer(&output[0])), + uintptr(len(output)), + ) + return syscall.UTF16ToString(output[:]), ret != 0 +} + +func GetDesktopWindow() HWND { + ret, _, _ := getDesktopWindow.Call() + return HWND(ret) +} + +func GetRawInputData(input HRAWINPUT, command uint) (raw RAWINPUT, ok bool) { + size := uint(unsafe.Sizeof(raw)) + ret, _, _ := getRawInputData.Call( + uintptr(input), + uintptr(command), + uintptr(unsafe.Pointer(&raw)), + uintptr(unsafe.Pointer(&size)), + unsafe.Sizeof(raw.Header), + ) + var fail uint32 + fail-- + ok = uint32(ret) != fail + return +} + +func RegisterPowerSettingNotification( + recipient HANDLE, + powerSettingGUID *GUID, + flags uint32, +) HANDLE { + ret, _, _ := registerPowerSettingNotification.Call( + uintptr(recipient), + uintptr(unsafe.Pointer(powerSettingGUID)), + uintptr(flags), + ) + return HANDLE(ret) +} + +func RegisterRawInputDevices(devices ...RAWINPUTDEVICE) bool { + if len(devices) == 0 { + return true + } + ret, _, _ := registerRawInputDevices.Call( + uintptr(unsafe.Pointer(&devices[0])), + uintptr(len(devices)), + unsafe.Sizeof(devices[0]), + ) + return ret != 0 +} + +func SetTimer(window HWND, idEvent uintptr, elapse uint, timerFunc uintptr) uintptr { + ret, _, _ := setTimer.Call( + uintptr(window), + idEvent, + uintptr(elapse), + timerFunc, + ) + return ret +} + +func GetActiveWindow() HWND { + ret, _, _ := getActiveWindow.Call() + return HWND(ret) +} + +func MessageBeep(typ uint) bool { + ret, _, _ := messageBeep.Call(uintptr(typ)) + return ret != 0 +} + +// Beep generates simple tones on the speaker. The function is synchronous; it +// performs an alertable wait and does not return control to its caller until +// the sound finishes. +// The frequency must be in the range 37 through 32,767 (0x25 through 0x7FFF). +func Beep(frequencyInHz, durationInMs uint32) bool { + ret, _, _ := beep.Call(uintptr(frequencyInHz), uintptr(durationInMs)) + return ret != 0 +} + +// GetCaretBlinkTime returns the time required to invert the caret's pixels, in +// milliseconds. If the number is negative, the time is infinite and thus the +// cursor does not blink. +func GetCaretBlinkTime() int { + ret, _, _ := getCaretBlinkTime.Call() + return int(int32(ret)) +} + +func GetWindowDC(window HWND) HDC { + ret, _, _ := getWindowDC.Call(uintptr(window)) + return HDC(ret) +} + +func EnumWindows(callback func(window HWND) bool) bool { + f := syscall.NewCallback(func(w, _ uintptr) uintptr { + if callback(HWND(w)) { + return 1 + } + return 0 + }) + ret, _, _ := enumWindows.Call(f, 0) + return ret != 0 +} + +func EnumChildWindows(parent HWND, callback func(window HWND) bool) bool { + f := syscall.NewCallback(func(w, _ uintptr) uintptr { + if callback(HWND(w)) { + return 1 + } + return 0 + }) + ret, _, _ := enumChildWindows.Call(uintptr(parent), f, 0) + return ret != 0 +} + +func GetTopWindow(of HWND) HWND { + ret, _, _ := getTopWindow.Call(uintptr(of)) + return HWND(ret) +} + +func GetWindow(rel HWND, cmd uint) HWND { + ret, _, _ := getWindow.Call(uintptr(rel), uintptr(cmd)) + return HWND(ret) +} + +func GetNextWindow(rel HWND, cmd uint) HWND { + return GetWindow(rel, cmd) +} + +func GetKeyState(key int) uint16 { + ret, _, _ := getKeyState.Call(uintptr(key)) + return uint16(ret) +} + +func GetSysColor(index int) uint32 { + ret, _, _ := getSysColor.Call(uintptr(index)) + return uint32(ret) +} + +func GetSysColorBrush(index int) HBRUSH { + ret, _, _ := getSysColorBrush.Call(uintptr(index)) + return HBRUSH(ret) +} + +func AppendMenu(m HMENU, flags uint, id uintptr, item string) bool { + ret, _, _ := appendMenu.Call( + uintptr(m), + uintptr(flags), + id, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(item))), + ) + return ret != 0 +} + +func CheckMenuItem(m HMENU, item, check uint) uint32 { + ret, _, _ := checkMenuItem.Call( + uintptr(m), + uintptr(item), + uintptr(check), + ) + return uint32(ret) +} + +func CheckMenuRadioItem(m HMENU, first, last, check, flags uint) bool { + ret, _, _ := checkMenuRadioItem.Call( + uintptr(m), + uintptr(first), + uintptr(last), + uintptr(check), + uintptr(flags), + ) + return ret != 0 +} + +func CreateMenu() HMENU { + ret, _, _ := createMenu.Call() + return HMENU(ret) +} + +func CreatePopupMenu() HMENU { + ret, _, _ := createPopupMenu.Call() + return HMENU(ret) +} + +func DeleteMenu(m HMENU, pos, flags uint) bool { + ret, _, _ := deleteMenu.Call( + uintptr(m), + uintptr(pos), + uintptr(flags), + ) + return ret != 0 +} + +func DestroyMenu(m HMENU) bool { + ret, _, _ := destroyMenu.Call(uintptr(m)) + return ret != 0 +} + +func DrawMenuBar(window HWND) bool { + ret, _, _ := drawMenuBar.Call(uintptr(window)) + return ret != 0 +} + +func EnableMenuItem(m HMENU, item, enable uint) int { + ret, _, _ := enableMenuItem.Call( + uintptr(m), + uintptr(item), + uintptr(enable), + ) + return int(ret) +} + +func EndMenu() bool { + ret, _, _ := endMenu.Call() + return ret != 0 +} + +func GetMenu(window HWND) HMENU { + ret, _, _ := getMenu.Call(uintptr(window)) + return HMENU(ret) +} + +func GetMenuBarInfo(w HWND, object, item int, info *MENUBARINFO) bool { + if info != nil { + info.size = uint32(unsafe.Sizeof(*info)) + } + ret, _, _ := getMenuBarInfo.Call( + uintptr(w), + uintptr(object), + uintptr(item), + uintptr(unsafe.Pointer(info)), + ) + return ret != 0 +} + +func GetMenuCheckMarkDimensions() (w, h int) { + ret, _, _ := getMenuCheckMarkDimensions.Call() + return int(ret & 0x00FFFF), int(ret&0xFFFF0000) >> 16 +} + +func GetMenuDefaultItem(m HMENU, byPos, flags uint) int { + ret, _, _ := getMenuDefaultItem.Call( + uintptr(m), + uintptr(byPos), + uintptr(flags), + ) + return int(ret) +} + +func GetMenuInfo(m HMENU, info *MENUINFO) bool { + if info != nil { + info.size = uint32(unsafe.Sizeof(*info)) + } + ret, _, _ := getMenuInfo.Call( + uintptr(m), + uintptr(unsafe.Pointer(info)), + ) + return ret != 0 +} + +func GetMenuItemCount(m HMENU) int { + ret, _, _ := getMenuItemCount.Call(uintptr(m)) + return int(ret) +} + +func GetMenuItemID(m HMENU, pos int) int { + ret, _, _ := getMenuItemID.Call(uintptr(m), uintptr(pos)) + return int(ret) +} + +func GetMenuItemInfo(m HMENU, item uint, byPos bool, info *MENUITEMINFO) bool { + if info != nil { + info.Size = uint32(unsafe.Sizeof(*info)) + } + ret, _, _ := getMenuItemInfo.Call( + uintptr(m), + uintptr(item), + uintptr(BoolToBOOL(byPos)), + uintptr(unsafe.Pointer(info)), + ) + return ret != 0 +} + +func GetMenuItemRect(w HWND, m HMENU, item uint, r *RECT) bool { + ret, _, _ := getMenuItemRect.Call( + uintptr(w), + uintptr(m), + uintptr(item), + uintptr(unsafe.Pointer(r)), + ) + return ret != 0 +} + +func GetMenuState(m HMENU, id, flags uint) int { + ret, _, _ := getMenuState.Call( + uintptr(m), + uintptr(id), + uintptr(flags), + ) + return int(ret) +} + +func GetMenuString(m HMENU, item, flags uint) string { + length, _, _ := getMenuString.Call( + uintptr(m), + uintptr(item), + 0, + 0, + uintptr(flags), + ) + if length == 0 { + return "" + } + buf := make([]uint16, length+1) + getMenuString.Call( + uintptr(m), + uintptr(item), + uintptr(unsafe.Pointer(&buf[0])), + length+1, + uintptr(flags), + ) + buf[length] = 0 + return syscall.UTF16ToString(buf) +} + +func GetSubMenu(menu HMENU, pos int) HMENU { + ret, _, _ := getSubMenu.Call(uintptr(menu), uintptr(pos)) + return HMENU(ret) +} + +func GetSystemMenu(w HWND, revert bool) HMENU { + ret, _, _ := getSystemMenu.Call( + uintptr(w), + uintptr(BoolToBOOL(revert)), + ) + return HMENU(ret) +} + +func HiliteMenuItem(w HWND, m HMENU, item, hilite uint) bool { + ret, _, _ := hiliteMenuItem.Call( + uintptr(w), + uintptr(m), + uintptr(item), + uintptr(hilite), + ) + return ret != 0 +} + +func InsertMenu(m HMENU, pos, flags uint, id uintptr, item string) bool { + ret, _, _ := insertMenu.Call( + uintptr(m), + uintptr(pos), + uintptr(flags), + id, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(item))), + ) + return ret != 0 +} + +func InsertMenuItem(m HMENU, item uint, byPos bool, newItem *MENUITEMINFO) bool { + ret, _, _ := insertMenuItem.Call( + uintptr(m), + uintptr(item), + uintptr(BoolToBOOL(byPos)), + uintptr(unsafe.Pointer(newItem)), + ) + return ret != 0 +} + +func IsMenu(m HMENU) bool { + ret, _, _ := isMenu.Call(uintptr(m)) + return ret != 0 +} + +func LoadMenu(inst HINSTANCE, menuName string) HMENU { + ret, _, _ := loadMenu.Call( + uintptr(inst), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(menuName))), + ) + return HMENU(ret) +} + +// TODO create nice API for this +func LoadMenuIndirect(template uintptr) HMENU { + ret, _, _ := loadMenuIndirect.Call(template) + return HMENU(ret) +} + +// ModifyMenu changes an existing menu item. This function is used to specify +// the content, appearance, and behavior of the menu item. +// +// Note The ModifyMenu function has been superseded by the SetMenuItemInfo +// function. You can still use ModifyMenu, however, if you do not need any of +// the extended features of SetMenuItemInfo. +func ModifyMenu(m HMENU, pos, flags uint, idNewItem uintptr, newItem string) bool { + ret, _, _ := modifyMenu.Call( + uintptr(m), + uintptr(pos), + uintptr(flags), + idNewItem, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(newItem))), + ) + return ret != 0 +} + +// RemoveMenu deletes a menu item or detaches a submenu from the specified menu. +// If the menu item opens a drop-down menu or submenu, RemoveMenu does not +// destroy the menu or its handle, allowing the menu to be reused. Before this +// function is called, the GetSubMenu function should retrieve a handle to the +// drop-down menu or submenu. +func RemoveMenu(m HMENU, pos, flags uint) bool { + ret, _, _ := removeMenu.Call( + uintptr(m), + uintptr(pos), + uintptr(flags), + ) + return ret != 0 +} + +func SetMenu(w HWND, m HMENU) bool { + ret, _, _ := setMenu.Call(uintptr(w), uintptr(m)) + return ret != 0 +} + +// SetMenuDefaultItem sets the default menu item for the specified menu. +func SetMenuDefaultItem(m HMENU, item, byPos uint) bool { + ret, _, _ := setMenuDefaultItem.Call( + uintptr(m), + uintptr(item), + uintptr(byPos), + ) + return ret != 0 +} + +// SetMenuInfo sets information for a specified menu. +func SetMenuInfo(m HMENU, info *MENUINFO) bool { + ret, _, _ := setMenuInfo.Call( + uintptr(m), + uintptr(unsafe.Pointer(info)), + ) + return ret != 0 +} + +// SetMenuItemBitmaps associates the specified bitmap with a menu item. Whether +// the menu item is selected or clear, the system displays the appropriate +// bitmap next to the menu item. +func SetMenuItemBitmaps(m HMENU, pos, flags uint, unchecked, checked HBITMAP) bool { + ret, _, _ := setMenuItemBitmaps.Call( + uintptr(m), + uintptr(pos), + uintptr(flags), + uintptr(unchecked), + uintptr(checked), + ) + return ret != 0 +} + +// SetMenuItemInfo changes information about a menu item. +func SetMenuItemInfo(m HMENU, item uint, byPos bool, mii *MENUITEMINFO) bool { + if mii != nil { + mii.Size = uint32(unsafe.Sizeof(*mii)) + } + ret, _, _ := setMenuItemInfo.Call( + uintptr(m), + uintptr(item), + uintptr(BoolToBOOL(byPos)), + uintptr(unsafe.Pointer(mii)), + ) + return ret != 0 +} + +// TrackPopupMenu displays a shortcut menu at the specified location and tracks +// the selection of items on the menu. The shortcut menu can appear anywhere on +// the screen. +func TrackPopupMenu(m HMENU, flags uint, x, y int, w HWND, r *RECT) int { + ret, _, _ := trackPopupMenu.Call( + uintptr(m), + uintptr(flags), + uintptr(x), + uintptr(y), + 0, // reserved parameter + uintptr(w), + uintptr(unsafe.Pointer(r)), + ) + return int(ret) +} + +// TrackPopupMenuEx displays a shortcut menu at the specified location and +// tracks the selection of items on the shortcut menu. The shortcut menu can +// appear anywhere on the screen. +func TrackPopupMenuEx(m HMENU, flags uint, x, y int, w HWND, tpm *TPMPARAMS) int { + ret, _, _ := trackPopupMenuEx.Call( + uintptr(m), + uintptr(flags), + uintptr(x), + uintptr(y), + uintptr(w), + uintptr(unsafe.Pointer(tpm)), + ) + return int(ret) +} + +func IsDlgButtonChecked(dlg HWND, id uintptr) uint { + ret, _, _ := isDlgButtonChecked.Call(uintptr(dlg), id) + return uint(ret) +} + +func SendDlgItemMessage(dlg HWND, id int, msg uint, w, l uintptr) uintptr { + ret, _, _ := sendDlgItemMessage.Call( + uintptr(dlg), + uintptr(id), + uintptr(msg), + uintptr(w), + uintptr(l), + ) + return ret +} + +func LookupIconIdFromDirectoryEx(mem unsafe.Pointer, icon bool, width, height int, flags uint) int { + ret, _, _ := lookupIconIdFromDirectoryEx.Call( + uintptr(mem), + uintptr(BoolToBOOL(icon)), + uintptr(width), + uintptr(height), + uintptr(flags), + ) + return int(ret) +} + +func SetForegroundWindow(window HWND) bool { + ret, _, _ := setForegroundWindow.Call(uintptr(window)) + return ret != 0 +} + +func ScrollWindow(window HWND, dx, dy int, r, clip *RECT) bool { + ret, _, _ := scrollWindow.Call( + uintptr(window), + uintptr(dx), + uintptr(dy), + uintptr(unsafe.Pointer(r)), + uintptr(unsafe.Pointer(clip)), + ) + return ret != 0 +} + +func GetFocus() HWND { + ret, _, _ := getFocus.Call() + return HWND(ret) +} + +func PrintWindow(w HWND, dc HDC, flags uint) bool { + ret, _, _ := printWindow.Call( + uintptr(w), + uintptr(dc), + uintptr(flags), + ) + return ret != 0 +} + +func SetLayeredWindowAttributes(window HWND, key COLORREF, alpha uint8, flags uint32) bool { + ret, _, _ := setLayeredWindowAttributes.Call( + uintptr(window), + uintptr(key), + uintptr(alpha), + uintptr(flags), + ) + return ret != 0 +} + +func RedrawWindow(window HWND, updateRect *RECT, updateRegion HRGN, flags uint32) bool { + ret, _, _ := redrawWindow.Call( + uintptr(window), + uintptr(unsafe.Pointer(updateRect)), + uintptr(updateRegion), + uintptr(flags), + ) + return ret != 0 +} + +func CreateCursor( + instance HINSTANCE, + xHotSpot, yHotSpot, width, height int, + andPlane, xorPlane []byte, +) HCURSOR { + var and, xor uintptr + if len(andPlane) > 0 { + and = uintptr(unsafe.Pointer(&andPlane[0])) + } + if len(xorPlane) > 0 { + xor = uintptr(unsafe.Pointer(&xorPlane[0])) + } + ret, _, _ := createCursor.Call( + uintptr(instance), + uintptr(xHotSpot), + uintptr(yHotSpot), + uintptr(width), + uintptr(height), + and, + xor, + ) + return HCURSOR(ret) +} + +func DestroyCursor(c HCURSOR) bool { + ret, _, _ := destroyCursor.Call(uintptr(c)) + return ret != 0 +} + +func GetDlgCtrlID(w HWND) int { + ret, _, _ := getDlgCtrlID.Call(uintptr(w)) + return int(ret) +} + +func SystemParametersInfo(action, param uint, data uintptr, winIni uint) bool { + ret, _, _ := systemParametersInfo.Call( + uintptr(action), + uintptr(param), + data, + uintptr(winIni), + ) + return ret != 0 +} + +func SystemParametersInfoString(action, param uint, data string, winIni uint) bool { + return SystemParametersInfo( + action, + param, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(data))), + winIni, + ) +} + +func RegCreateKey(hKey HKEY, subKey string) HKEY { + var result HKEY + ret, _, _ := regCreateKeyEx.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(0), + uintptr(0), + uintptr(0), + uintptr(KEY_ALL_ACCESS), + uintptr(0), + uintptr(unsafe.Pointer(&result)), + uintptr(0)) + _ = ret + return result +} + +func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY { + var result HKEY + ret, _, _ := regOpenKeyEx.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(0), + uintptr(samDesired), + uintptr(unsafe.Pointer(&result))) + if ret != ERROR_SUCCESS { + return HKEY(INVALID_HANDLE_VALUE) + } + return result +} + +func RegCloseKey(hKey HKEY) error { + var err error + ret, _, _ := regCloseKey.Call( + uintptr(hKey)) + + if ret != ERROR_SUCCESS { + err = errors.New("RegCloseKey failed") + } + return err +} + +func RegGetRaw(hKey HKEY, subKey string, value string) []byte { + var bufLen uint32 + var valptr unsafe.Pointer + if len(value) > 0 { + valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value)) + } + regGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(valptr), + uintptr(RRF_RT_ANY), + 0, + 0, + uintptr(unsafe.Pointer(&bufLen)), + ) + + if bufLen == 0 { + return nil + } + + buf := make([]byte, bufLen) + ret, _, _ := regGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(valptr), + uintptr(RRF_RT_ANY), + 0, + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen)), + ) + + if ret != ERROR_SUCCESS { + return nil + } + + return buf +} + +func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) { + var lptr, vptr unsafe.Pointer + if len(subKey) > 0 { + lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey)) + } + if len(value) > 0 { + vptr = unsafe.Pointer(&value[0]) + } + ret, _, _ := regSetValueEx.Call( + uintptr(hKey), + uintptr(lptr), + uintptr(0), + uintptr(REG_BINARY), + uintptr(vptr), + uintptr(len(value)), + ) + return int(ret) +} + +func RegSetString(hKey HKEY, subKey string, value string) (errno int) { + var lptr, vptr unsafe.Pointer + if subKey != "" { + lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey)) + } + var dataLength int + if value != "" { + buf, err := syscall.UTF16FromString(value) + if err != nil { + return ERROR_BAD_FORMAT + } + vptr = unsafe.Pointer(&buf[0]) + dataLength = len(buf) * 2 + } + ret, _, _ := regSetValueEx.Call( + uintptr(hKey), + uintptr(lptr), + uintptr(0), + uintptr(REG_SZ), + uintptr(vptr), + uintptr(dataLength), + ) + return int(ret) +} + +func RegSetUint32(hKey HKEY, subKey string, value uint32) (errno int) { + var lptr unsafe.Pointer + if len(subKey) > 0 { + lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey)) + } + vptr := unsafe.Pointer(&value) + ret, _, _ := regSetValueEx.Call( + uintptr(hKey), + uintptr(lptr), + uintptr(0), + uintptr(REG_DWORD), + uintptr(vptr), + uintptr(unsafe.Sizeof(value)), + ) + return int(ret) +} + +func RegGetString(hKey HKEY, subKey string, value string) string { + var bufLen uint32 + regGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + uintptr(RRF_RT_REG_SZ), + 0, + 0, + uintptr(unsafe.Pointer(&bufLen)), + ) + + if bufLen == 0 { + return "" + } + + buf := make([]uint16, bufLen) + ret, _, _ := regGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + uintptr(RRF_RT_REG_SZ), + 0, + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen)), + ) + + if ret != ERROR_SUCCESS { + return "" + } + + return syscall.UTF16ToString(buf) +} + +func RegGetUint32(hKey HKEY, subKey string, value string) (data uint32, errno int) { + var dataLen uint32 = uint32(unsafe.Sizeof(data)) + ret, _, _ := regGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + uintptr(RRF_RT_REG_DWORD), + 0, + uintptr(unsafe.Pointer(&data)), + uintptr(unsafe.Pointer(&dataLen)), + ) + errno = int(ret) + return +} + +func RegDeleteKeyValue(hKey HKEY, subKey string, valueName string) (errno int) { + ret, _, _ := regDeleteKeyValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))), + ) + return int(ret) +} + +func RegDeleteValue(hKey HKEY, valueName string) (errno int) { + ret, _, _ := regDeleteValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))), + ) + return int(ret) +} + +func RegDeleteTree(hKey HKEY, subKey string) (errno int) { + ret, _, _ := regDeleteTree.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + ) + return int(ret) +} + +func RegEnumKeyEx(hKey HKEY, index uint32) string { + var bufLen uint32 = 255 + buf := make([]uint16, bufLen) + regEnumKeyEx.Call( + uintptr(hKey), + uintptr(index), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen)), + 0, + 0, + 0, + 0, + ) + return syscall.UTF16ToString(buf) +} + +func RegEnumValue(key HKEY, index uint32) { + var valueLen uint32 + _, _, _ = regEnumValue.Call( + uintptr(key), + uintptr(index), + 0, + uintptr(unsafe.Pointer(&valueLen)), + 0, + ) +} + +func OpenEventLog(servername string, sourcename string) HANDLE { + ret, _, _ := openEventLog.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename))), + ) + return HANDLE(ret) +} + +func GetNumberOfEventLogRecords(eventlog HANDLE) (n uint32, ok bool) { + ret, _, _ := getNumberOfEventLogRecords.Call( + uintptr(eventlog), + uintptr(unsafe.Pointer(&n)), + ) + ok = ret != 0 + return +} + +func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool { + ret, _, _ := readEventLog.Call( + uintptr(eventlog), + uintptr(readflags), + uintptr(recordoffset), + uintptr(unsafe.Pointer(&buffer[0])), + uintptr(numberofbytestoread), + uintptr(unsafe.Pointer(bytesread)), + uintptr(unsafe.Pointer(minnumberofbytesneeded)), + ) + return ret != 0 +} + +func CloseEventLog(eventlog HANDLE) bool { + ret, _, _ := closeEventLog.Call(uintptr(eventlog)) + return ret != 0 +} + +func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) { + var p1, p2 uintptr + if len(lpMachineName) > 0 { + p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName))) + } + if len(lpDatabaseName) > 0 { + p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName))) + } + ret, _, _ := openSCManager.Call( + p1, + p2, + uintptr(dwDesiredAccess)) + + if ret == 0 { + return 0, syscall.GetLastError() + } + return HANDLE(ret), nil +} + +func CloseServiceHandle(hSCObject HANDLE) error { + ret, _, _ := closeServiceHandle.Call(uintptr(hSCObject)) + if ret == 0 { + return syscall.GetLastError() + } + return nil +} + +func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) { + ret, _, _ := openService.Call( + uintptr(hSCManager), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))), + uintptr(dwDesiredAccess), + ) + + if ret == 0 { + return 0, syscall.GetLastError() + } + + return HANDLE(ret), nil +} + +func StartService(hService HANDLE, lpServiceArgVectors []string) error { + l := len(lpServiceArgVectors) + var ret uintptr + if l == 0 { + ret, _, _ = startService.Call( + uintptr(hService), + 0, + 0, + ) + } else { + lpArgs := make([]uintptr, l) + for i := 0; i < l; i++ { + lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i]))) + } + + ret, _, _ = startService.Call( + uintptr(hService), + uintptr(l), + uintptr(unsafe.Pointer(&lpArgs[0])), + ) + } + + if ret == 0 { + return syscall.GetLastError() + } + + return nil +} + +func ControlService(service HANDLE, control uint32, serviceStatus *SERVICE_STATUS) bool { + ret, _, _ := controlService.Call( + uintptr(service), + uintptr(control), + uintptr(unsafe.Pointer(serviceStatus)), + ) + return ret != 0 +} + +func InitCommonControlsEx(lpInitCtrls *INITCOMMONCONTROLSEX) bool { + if lpInitCtrls != nil { + lpInitCtrls.size = 8 + } + ret, _, _ := initCommonControlsEx.Call(uintptr(unsafe.Pointer(lpInitCtrls))) + return ret != 0 +} + +func ImageList_Create(cx, cy int, flags uint, cInitial, cGrow int) HIMAGELIST { + ret, _, _ := imageList_Create.Call( + uintptr(cx), + uintptr(cy), + uintptr(flags), + uintptr(cInitial), + uintptr(cGrow), + ) + return HIMAGELIST(ret) +} + +func ImageList_Destroy(himl HIMAGELIST) bool { + ret, _, _ := imageList_Destroy.Call(uintptr(himl)) + return ret != 0 +} + +func ImageList_GetImageCount(himl HIMAGELIST) int { + ret, _, _ := imageList_GetImageCount.Call(uintptr(himl)) + return int(ret) +} + +func ImageList_SetImageCount(himl HIMAGELIST, uNewCount uint) bool { + ret, _, _ := imageList_SetImageCount.Call( + uintptr(himl), + uintptr(uNewCount), + ) + return ret != 0 +} + +func ImageList_Add(himl HIMAGELIST, hbmImage, hbmMask HBITMAP) int { + ret, _, _ := imageList_Add.Call( + uintptr(himl), + uintptr(hbmImage), + uintptr(hbmMask), + ) + return int(ret) +} + +func ImageList_ReplaceIcon(himl HIMAGELIST, i int, hicon HICON) int { + ret, _, _ := imageList_ReplaceIcon.Call( + uintptr(himl), + uintptr(i), + uintptr(hicon), + ) + return int(ret) +} + +func ImageList_AddIcon(himl HIMAGELIST, hicon HICON) int { + return ImageList_ReplaceIcon(himl, -1, hicon) +} + +func ImageList_Remove(himl HIMAGELIST, i int) bool { + ret, _, _ := imageList_Remove.Call( + uintptr(himl), + uintptr(i), + ) + return ret != 0 +} + +func ImageList_RemoveAll(himl HIMAGELIST) bool { + return ImageList_Remove(himl, -1) +} + +func TrackMouseEvent(tme *TRACKMOUSEEVENT) bool { + ret, _, _ := trackMouseEvent.Call(uintptr(unsafe.Pointer(tme))) + return ret != 0 +} + +func SetWindowSubclass(window HWND, proc uintptr, id uintptr, refData uintptr) bool { + ret, _, _ := setWindowSubclass.Call( + uintptr(window), + proc, + uintptr(id), + refData, + ) + return ret != 0 +} + +func DefSubclassProc(window HWND, msg uint32, w, l uintptr) uintptr { + ret, _, _ := defSubclassProc.Call( + uintptr(window), + uintptr(msg), + w, + l, + ) + return ret +} + +// GetOpenFileName automatically sets the StructSize member of the OPENFILENAME. +func GetOpenFileName(ofn *OPENFILENAME) bool { + if ofn != nil { + ofn.StructSize = uint32(unsafe.Sizeof(*ofn)) + } + ret, _, _ := getOpenFileName.Call(uintptr(unsafe.Pointer(ofn))) + return ret != 0 +} + +// GetSaveFileName automatically sets the StructSize member of the OPENFILENAME. +func GetSaveFileName(ofn *OPENFILENAME) bool { + if ofn != nil { + ofn.StructSize = uint32(unsafe.Sizeof(*ofn)) + } + ret, _, _ := getSaveFileName.Call(uintptr(unsafe.Pointer(ofn))) + return ret != 0 +} + +func CommDlgExtendedError() uint { + ret, _, _ := commDlgExtendedError.Call() + return uint(ret) +} + +func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) { + var result uint + ret, _, _ := dwmDefWindowProc.Call( + uintptr(hWnd), + uintptr(msg), + wParam, + lParam, + uintptr(unsafe.Pointer(&result)), + ) + return ret != 0, result +} + +func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT { + ret, _, _ := dwmEnableBlurBehindWindow.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pBlurBehind)), + ) + return HRESULT(ret) +} + +func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT { + ret, _, _ := dwmEnableMMCSS.Call(uintptr(BoolToBOOL(fEnableMMCSS))) + return HRESULT(ret) +} + +func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT { + ret, _, _ := dwmExtendFrameIntoClientArea.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pMarInset)), + ) + return HRESULT(ret) +} + +func DwmFlush() HRESULT { + ret, _, _ := dwmFlush.Call() + return HRESULT(ret) +} + +func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT { + ret, _, _ := dwmGetColorizationColor.Call( + uintptr(unsafe.Pointer(pcrColorization)), + uintptr(unsafe.Pointer(pfOpaqueBlend)), + ) + return HRESULT(ret) +} + +func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT { + ret, _, _ := dwmGetCompositionTimingInfo.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pTimingInfo)), + ) + return HRESULT(ret) +} + +func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT { + ret, _, _ := dwmGetTransportAttributes.Call( + uintptr(unsafe.Pointer(pfIsRemoting)), + uintptr(unsafe.Pointer(pfIsConnected)), + uintptr(unsafe.Pointer(pDwGeneration)), + ) + return HRESULT(ret) +} + +func DwmGetWindowAttributeNCRENDERING_ENABLED(window HWND) (ok, enabled bool) { + var b uint32 + ret, _, _ := dwmGetWindowAttribute.Call( + uintptr(window), + uintptr(DWMWA_NCRENDERING_ENABLED), + uintptr(unsafe.Pointer(&b)), + 4, // size of uint32 + ) + ok = ret == S_OK + enabled = b != 0 + return +} + +func DwmGetWindowAttributeCAPTION_BUTTON_BOUNDS(window HWND) (ok bool, r RECT) { + ret, _, _ := dwmGetWindowAttribute.Call( + uintptr(window), + uintptr(DWMWA_CAPTION_BUTTON_BOUNDS), + uintptr(unsafe.Pointer(&r)), + 16, // size of RECT + ) + ok = ret == S_OK + return +} + +func DwmGetWindowAttributeEXTENDED_FRAME_BOUNDS(window HWND) (ok bool, r RECT) { + ret, _, _ := dwmGetWindowAttribute.Call( + uintptr(window), + uintptr(DWMWA_EXTENDED_FRAME_BOUNDS), + uintptr(unsafe.Pointer(&r)), + 16, // size of RECT + ) + ok = ret == S_OK + return +} + +// DwmGetWindowAttributeCLOAKED returns one of the DWM_... constants. +func DwmGetWindowAttributeCLOAKED(window HWND) (ok bool, cloaked uint32) { + ret, _, _ := dwmGetWindowAttribute.Call( + uintptr(window), + uintptr(DWMWA_CLOAKED), + uintptr(unsafe.Pointer(&cloaked)), + 16, // size of uint32 + ) + ok = ret == S_OK + return +} + +func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT { + ret, _, _ := dwmInvalidateIconicBitmaps.Call(uintptr(hWnd)) + return HRESULT(ret) +} + +func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT { + ret, _, _ := dwmIsCompositionEnabled.Call(uintptr(unsafe.Pointer(pfEnabled))) + return HRESULT(ret) +} + +func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT { + ret, _, _ := dwmModifyPreviousDxFrameDuration.Call( + uintptr(hWnd), + uintptr(cRefreshes), + uintptr(BoolToBOOL(fRelative)), + ) + return HRESULT(ret) +} + +func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT { + ret, _, _ := dwmQueryThumbnailSourceSize.Call( + uintptr(hThumbnail), + uintptr(unsafe.Pointer(pSize)), + ) + return HRESULT(ret) +} + +func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT { + ret, _, _ := dwmRegisterThumbnail.Call( + uintptr(hWndDestination), + uintptr(hWndSource), + uintptr(unsafe.Pointer(phThumbnailId)), + ) + return HRESULT(ret) +} + +func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) { + dwmRenderGesture.Call( + uintptr(gt), + uintptr(cContacts), + uintptr(unsafe.Pointer(pdwPointerID)), + uintptr(unsafe.Pointer(pPoints)), + ) + return +} + +func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT { + ret, _, _ := dwmSetDxFrameDuration.Call( + uintptr(hWnd), + uintptr(cRefreshes), + ) + return HRESULT(ret) +} + +func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT { + ret, _, _ := dwmSetIconicLivePreviewBitmap.Call( + uintptr(hWnd), + uintptr(hbmp), + uintptr(unsafe.Pointer(pptClient)), + uintptr(dwSITFlags), + ) + return HRESULT(ret) +} + +func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT { + ret, _, _ := dwmSetIconicThumbnail.Call( + uintptr(hWnd), + uintptr(hbmp), + uintptr(dwSITFlags), + ) + return HRESULT(ret) +} + +func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT { + ret, _, _ := dwmSetPresentParameters.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pPresentParams)), + ) + return HRESULT(ret) +} + +func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT { + ret, _, _ := dwmSetWindowAttribute.Call( + uintptr(hWnd), + uintptr(dwAttribute), + uintptr(pvAttribute), + uintptr(cbAttribute), + ) + return HRESULT(ret) +} + +func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) { + dwmShowContact.Call( + uintptr(dwPointerID), + uintptr(eShowContact), + ) + return +} + +func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) { + dwmTetherContact.Call( + uintptr(dwPointerID), + uintptr(BoolToBOOL(fEnable)), + uintptr(unsafe.Pointer(&ptTether)), + ) + return +} + +func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) { + dwmTransitionOwnedWindow.Call( + uintptr(hWnd), + uintptr(target), + ) + return +} + +func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT { + ret, _, _ := dwmUnregisterThumbnail.Call(uintptr(hThumbnailId)) + return HRESULT(ret) +} + +func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT { + ret, _, _ := dwmUpdateThumbnailProperties.Call( + uintptr(hThumbnailId), + uintptr(unsafe.Pointer(ptnProperties)), + ) + return HRESULT(ret) +} + +func GetDeviceCaps(hdc HDC, index int) int { + ret, _, _ := getDeviceCaps.Call( + uintptr(hdc), + uintptr(index), + ) + return int(ret) +} + +func DeleteObject(hObject HGDIOBJ) bool { + ret, _, _ := deleteObject.Call(uintptr(hObject)) + return ret != 0 +} + +func CreateFontIndirect(logFont *LOGFONT) HFONT { + ret, _, _ := createFontIndirect.Call(uintptr(unsafe.Pointer(logFont))) + return HFONT(ret) +} + +func AbortDoc(hdc HDC) int { + ret, _, _ := abortDoc.Call(uintptr(hdc)) + return int(ret) +} + +func BitBlt(hdcDest HDC, nXDest, nYDest, nWidth, nHeight int, hdcSrc HDC, nXSrc, nYSrc int, dwRop uint) bool { + ret, _, _ := bitBlt.Call( + uintptr(hdcDest), + uintptr(nXDest), + uintptr(nYDest), + uintptr(nWidth), + uintptr(nHeight), + uintptr(hdcSrc), + uintptr(nXSrc), + uintptr(nYSrc), + uintptr(dwRop), + ) + return ret != 0 +} + +func MaskBlt( + dest HDC, destX, destY, destWidth, destHeight int, + source HDC, sourceX, sourceY int, + mask HBITMAP, maskX, maskY int, + operation uint, +) bool { + ret, _, _ := maskBlt.Call( + uintptr(dest), + uintptr(destX), + uintptr(destY), + uintptr(destWidth), + uintptr(destHeight), + uintptr(source), + uintptr(sourceX), + uintptr(sourceY), + uintptr(mask), + uintptr(maskX), + uintptr(maskX), + uintptr(operation), + ) + return ret != 0 +} + +func PatBlt(hdc HDC, nXLeft, nYLeft, nWidth, nHeight int, dwRop uint) bool { + ret, _, _ := patBlt.Call( + uintptr(hdc), + uintptr(nXLeft), + uintptr(nYLeft), + uintptr(nWidth), + uintptr(nHeight), + uintptr(dwRop), + ) + return ret != 0 +} + +func CloseEnhMetaFile(hdc HDC) HENHMETAFILE { + ret, _, _ := closeEnhMetaFile.Call(uintptr(hdc)) + return HENHMETAFILE(ret) +} + +func CopyEnhMetaFile(hemfSrc HENHMETAFILE, lpszFile *uint16) HENHMETAFILE { + ret, _, _ := copyEnhMetaFile.Call( + uintptr(hemfSrc), + uintptr(unsafe.Pointer(lpszFile)), + ) + return HENHMETAFILE(ret) +} + +func CreateBrushIndirect(lplb *LOGBRUSH) HBRUSH { + ret, _, _ := createBrushIndirect.Call(uintptr(unsafe.Pointer(lplb))) + return HBRUSH(ret) +} + +func CreateCompatibleDC(hdc HDC) HDC { + ret, _, _ := createCompatibleDC.Call(uintptr(hdc)) + return HDC(ret) +} + +func CreateCompatibleBitmap(hdc HDC, width, height int) HBITMAP { + ret, _, _ := createCompatibleBitmap.Call( + uintptr(hdc), + uintptr(width), + uintptr(height), + ) + return HBITMAP(ret) +} + +func CreateBitmap(width, height int, planes, bitCount uint, bits unsafe.Pointer) HBITMAP { + ret, _, _ := createBitmap.Call( + uintptr(width), + uintptr(height), + uintptr(planes), + uintptr(bitCount), + uintptr(bits), + ) + return HBITMAP(ret) +} + +func CreateDC(lpszDriver, lpszDevice, lpszOutput *uint16, lpInitData *DEVMODE) HDC { + ret, _, _ := createDC.Call( + uintptr(unsafe.Pointer(lpszDriver)), + uintptr(unsafe.Pointer(lpszDevice)), + uintptr(unsafe.Pointer(lpszOutput)), + uintptr(unsafe.Pointer(lpInitData)), + ) + return HDC(ret) +} + +func CreateDIBSection(hdc HDC, pbmi *BITMAPINFO, iUsage uint, ppvBits *unsafe.Pointer, hSection HANDLE, dwOffset uint) HBITMAP { + ret, _, _ := createDIBSection.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(pbmi)), + uintptr(iUsage), + uintptr(unsafe.Pointer(ppvBits)), + uintptr(hSection), + uintptr(dwOffset), + ) + return HBITMAP(ret) +} + +func CreateEnhMetaFile(hdcRef HDC, lpFilename *uint16, lpRect *RECT, lpDescription *uint16) HDC { + ret, _, _ := createEnhMetaFile.Call( + uintptr(hdcRef), + uintptr(unsafe.Pointer(lpFilename)), + uintptr(unsafe.Pointer(lpRect)), + uintptr(unsafe.Pointer(lpDescription)), + ) + return HDC(ret) +} + +func CreateIC(lpszDriver, lpszDevice, lpszOutput *uint16, lpdvmInit *DEVMODE) HDC { + ret, _, _ := createIC.Call( + uintptr(unsafe.Pointer(lpszDriver)), + uintptr(unsafe.Pointer(lpszDevice)), + uintptr(unsafe.Pointer(lpszOutput)), + uintptr(unsafe.Pointer(lpdvmInit)), + ) + return HDC(ret) +} + +func DeleteDC(hdc HDC) bool { + ret, _, _ := deleteDC.Call(uintptr(hdc)) + return ret != 0 +} + +func DeleteEnhMetaFile(hemf HENHMETAFILE) bool { + ret, _, _ := deleteEnhMetaFile.Call(uintptr(hemf)) + return ret != 0 +} + +func Ellipse(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool { + ret, _, _ := ellipse.Call( + uintptr(hdc), + uintptr(nLeftRect), + uintptr(nTopRect), + uintptr(nRightRect), + uintptr(nBottomRect), + ) + return ret != 0 +} + +func EndDoc(hdc HDC) int { + ret, _, _ := endDoc.Call(uintptr(hdc)) + return int(ret) +} + +func EndPage(hdc HDC) int { + ret, _, _ := endPage.Call(uintptr(hdc)) + return int(ret) +} + +func ExtCreatePen(dwPenStyle, dwWidth uint, lplb *LOGBRUSH, dwStyleCount uint, lpStyle *uint) HPEN { + ret, _, _ := extCreatePen.Call( + uintptr(dwPenStyle), + uintptr(dwWidth), + uintptr(unsafe.Pointer(lplb)), + uintptr(dwStyleCount), + uintptr(unsafe.Pointer(lpStyle)), + ) + return HPEN(ret) +} + +func GetEnhMetaFile(lpszMetaFile *uint16) HENHMETAFILE { + ret, _, _ := getEnhMetaFile.Call(uintptr(unsafe.Pointer(lpszMetaFile))) + return HENHMETAFILE(ret) +} + +func GetEnhMetaFileHeader(hemf HENHMETAFILE, cbBuffer uint, lpemh *ENHMETAHEADER) uint { + ret, _, _ := getEnhMetaFileHeader.Call( + uintptr(hemf), + uintptr(cbBuffer), + uintptr(unsafe.Pointer(lpemh)), + ) + return uint(ret) +} + +func GetObject(hgdiobj HGDIOBJ, cbBuffer uintptr, lpvObject unsafe.Pointer) int { + ret, _, _ := getObject.Call( + uintptr(hgdiobj), + uintptr(cbBuffer), + uintptr(lpvObject), + ) + return int(ret) +} + +func GetStockObject(fnObject int) HGDIOBJ { + ret, _, _ := getStockObject.Call(uintptr(fnObject)) + return HGDIOBJ(ret) +} + +func GetTextExtentExPoint(hdc HDC, lpszStr *uint16, cchString, nMaxExtent int, lpnFit, alpDx *int, lpSize *SIZE) bool { + ret, _, _ := getTextExtentExPoint.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpszStr)), + uintptr(cchString), + uintptr(nMaxExtent), + uintptr(unsafe.Pointer(lpnFit)), + uintptr(unsafe.Pointer(alpDx)), + uintptr(unsafe.Pointer(lpSize)), + ) + return ret != 0 +} + +func GetTextExtentPoint32(hdc HDC, text string) (SIZE, bool) { + var s SIZE + str, err := syscall.UTF16FromString(text) + if err != nil { + return s, false + } + ret, _, _ := getTextExtentPoint32.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(&str[0])), + uintptr(len(str)-1), // -1 for the trailing '\0' + uintptr(unsafe.Pointer(&s)), + ) + return s, ret != 0 +} + +func GetTextMetrics(hdc HDC, lptm *TEXTMETRIC) bool { + ret, _, _ := getTextMetrics.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lptm)), + ) + return ret != 0 +} + +func LineTo(hdc HDC, nXEnd, nYEnd int) bool { + ret, _, _ := lineTo.Call( + uintptr(hdc), + uintptr(nXEnd), + uintptr(nYEnd), + ) + return ret != 0 +} + +func MoveToEx(hdc HDC, x, y int, lpPoint *POINT) bool { + ret, _, _ := moveToEx.Call( + uintptr(hdc), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(lpPoint)), + ) + return ret != 0 +} + +func PlayEnhMetaFile(hdc HDC, hemf HENHMETAFILE, lpRect *RECT) bool { + ret, _, _ := playEnhMetaFile.Call( + uintptr(hdc), + uintptr(hemf), + uintptr(unsafe.Pointer(lpRect)), + ) + return ret != 0 +} + +func Rectangle(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool { + ret, _, _ := rectangle.Call( + uintptr(hdc), + uintptr(nLeftRect), + uintptr(nTopRect), + uintptr(nRightRect), + uintptr(nBottomRect), + ) + return ret != 0 +} + +func ResetDC(hdc HDC, lpInitData *DEVMODE) HDC { + ret, _, _ := resetDC.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpInitData)), + ) + return HDC(ret) +} + +func SelectObject(hdc HDC, hgdiobj HGDIOBJ) HGDIOBJ { + ret, _, _ := selectObject.Call( + uintptr(hdc), + uintptr(hgdiobj), + ) + return HGDIOBJ(ret) +} + +func SetBkMode(hdc HDC, iBkMode int) int { + ret, _, _ := setBkMode.Call( + uintptr(hdc), + uintptr(iBkMode), + ) + return int(ret) +} + +func SetBrushOrgEx(hdc HDC, nXOrg, nYOrg int, lppt *POINT) bool { + ret, _, _ := setBrushOrgEx.Call( + uintptr(hdc), + uintptr(nXOrg), + uintptr(nYOrg), + uintptr(unsafe.Pointer(lppt)), + ) + return ret != 0 +} + +func SetStretchBltMode(hdc HDC, iStretchMode int) int { + ret, _, _ := setStretchBltMode.Call( + uintptr(hdc), + uintptr(iStretchMode), + ) + return int(ret) +} + +func SetTextColor(hdc HDC, crColor COLORREF) COLORREF { + ret, _, _ := setTextColor.Call( + uintptr(hdc), + uintptr(crColor), + ) + return COLORREF(ret) +} + +func SetBkColor(hdc HDC, crColor COLORREF) COLORREF { + ret, _, _ := setBkColor.Call( + uintptr(hdc), + uintptr(crColor), + ) + return COLORREF(ret) +} + +func StartDoc(hdc HDC, lpdi *DOCINFO) int { + ret, _, _ := startDoc.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpdi)), + ) + return int(ret) +} + +func StartPage(hdc HDC) int { + ret, _, _ := startPage.Call(uintptr(hdc)) + return int(ret) +} + +func StretchBlt(hdcDest HDC, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest int, hdcSrc HDC, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc int, dwRop uint) bool { + ret, _, _ := stretchBlt.Call( + uintptr(hdcDest), + uintptr(nXOriginDest), + uintptr(nYOriginDest), + uintptr(nWidthDest), + uintptr(nHeightDest), + uintptr(hdcSrc), + uintptr(nXOriginSrc), + uintptr(nYOriginSrc), + uintptr(nWidthSrc), + uintptr(nHeightSrc), + uintptr(dwRop), + ) + return ret != 0 +} + +func SetDIBitsToDevice(hdc HDC, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc int, uStartScan, cScanLines uint, lpvBits []byte, lpbmi *BITMAPINFO, fuColorUse uint) int { + ret, _, _ := setDIBitsToDevice.Call( + uintptr(hdc), + uintptr(xDest), + uintptr(yDest), + uintptr(dwWidth), + uintptr(dwHeight), + uintptr(xSrc), + uintptr(ySrc), + uintptr(uStartScan), + uintptr(cScanLines), + uintptr(unsafe.Pointer(&lpvBits[0])), + uintptr(unsafe.Pointer(lpbmi)), + uintptr(fuColorUse), + ) + return int(ret) +} + +func ChoosePixelFormat(hdc HDC, pfd *PIXELFORMATDESCRIPTOR) int { + ret, _, _ := choosePixelFormat.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(pfd)), + ) + return int(ret) +} + +func DescribePixelFormat(hdc HDC, iPixelFormat int, nBytes uint, pfd *PIXELFORMATDESCRIPTOR) int { + ret, _, _ := describePixelFormat.Call( + uintptr(hdc), + uintptr(iPixelFormat), + uintptr(nBytes), + uintptr(unsafe.Pointer(pfd)), + ) + return int(ret) +} + +func GetEnhMetaFilePixelFormat(hemf HENHMETAFILE, cbBuffer uint32, pfd *PIXELFORMATDESCRIPTOR) uint { + ret, _, _ := getEnhMetaFilePixelFormat.Call( + uintptr(hemf), + uintptr(cbBuffer), + uintptr(unsafe.Pointer(pfd)), + ) + return uint(ret) +} + +func GetPixelFormat(hdc HDC) int { + ret, _, _ := getPixelFormat.Call(uintptr(hdc)) + return int(ret) +} + +func SetPixelFormat(hdc HDC, iPixelFormat int, pfd *PIXELFORMATDESCRIPTOR) bool { + ret, _, _ := setPixelFormat.Call( + uintptr(hdc), + uintptr(iPixelFormat), + uintptr(unsafe.Pointer(pfd)), + ) + return ret == TRUE +} + +func SwapBuffers(hdc HDC) bool { + ret, _, _ := swapBuffers.Call(uintptr(hdc)) + return ret == TRUE +} + +func TextOut(hdc HDC, x, y int, s string) bool { + str, err := syscall.UTF16FromString(s) + if err != nil { + return false + } + ret, _, _ := textOut.Call( + uintptr(hdc), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(&str[0])), + uintptr(len(str)-1), // -1 for the trailing '\0' + ) + return ret != 0 +} + +func CreateSolidBrush(color uint32) HBRUSH { + ret, _, _ := createSolidBrush.Call(uintptr(color)) + return HBRUSH(ret) +} + +func GetDIBits( + dc HDC, + bmp HBITMAP, + startScan, scanLines uint, + bits unsafe.Pointer, + info *BITMAPINFO, + usage uint, +) int { + ret, _, _ := getDIBits.Call( + uintptr(dc), + uintptr(bmp), + uintptr(startScan), + uintptr(scanLines), + uintptr(bits), + uintptr(unsafe.Pointer(info)), + uintptr(usage), + ) + return int(ret) +} + +func Pie(hdc HDC, left, top, right, bottom, xr1, yr1, xr2, yr2 int) bool { + ret, _, _ := pie.Call( + uintptr(hdc), + uintptr(left), + uintptr(top), + uintptr(right), + uintptr(bottom), + uintptr(xr1), + uintptr(yr1), + uintptr(xr2), + uintptr(yr2), + ) + return ret != 0 +} + +func SetDCPenColor(hdc HDC, color COLORREF) COLORREF { + ret, _, _ := setDCPenColor.Call(uintptr(hdc), uintptr(color)) + return COLORREF(ret) +} + +func SetDCBrushColor(hdc HDC, color COLORREF) COLORREF { + ret, _, _ := setDCBrushColor.Call(uintptr(hdc), uintptr(color)) + return COLORREF(ret) +} + +func CreatePen(style int, width int, color COLORREF) HPEN { + ret, _, _ := createPen.Call( + uintptr(style), + uintptr(width), + uintptr(color), + ) + return HPEN(ret) +} + +func Arc(hdc HDC, x1, y1, x2, y2, x3, y3, x4, y4 int) bool { + ret, _, _ := arc.Call( + uintptr(hdc), + uintptr(x1), + uintptr(y1), + uintptr(x2), + uintptr(y2), + uintptr(x3), + uintptr(y3), + uintptr(x4), + uintptr(y4), + ) + return ret != 0 +} + +func ArcTo(hdc HDC, left, top, right, bottom, xr1, yr1, xr2, yr2 int) bool { + ret, _, _ := arcTo.Call( + uintptr(hdc), + uintptr(left), + uintptr(top), + uintptr(right), + uintptr(bottom), + uintptr(xr1), + uintptr(yr1), + uintptr(xr2), + uintptr(yr2), + ) + return ret != 0 +} + +func AngleArc(hdc HDC, x, y, r int, startAngle, sweepAngle float32) bool { + ret, _, _ := angleArc.Call( + uintptr(hdc), + uintptr(x), + uintptr(y), + uintptr(r), + uintptr(startAngle), + uintptr(sweepAngle), + ) + return ret != 0 +} + +func Chord(hdc HDC, x1, y1, x2, y2, x3, y3, x4, y4 int) bool { + ret, _, _ := chord.Call( + uintptr(hdc), + uintptr(x1), + uintptr(y1), + uintptr(x2), + uintptr(y2), + uintptr(x3), + uintptr(y3), + uintptr(x4), + uintptr(y4), + ) + return ret != 0 +} + +func Polygon(hdc HDC, p []POINT) bool { + if len(p) == 0 { + return true + } + ret, _, _ := polygon.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(&p[0])), + uintptr(len(p)), + ) + return ret != 0 +} + +func PolygonMem(hdc HDC, start unsafe.Pointer, pointCount int) bool { + ret, _, _ := polygon.Call( + uintptr(hdc), + uintptr(start), + uintptr(pointCount), + ) + return ret != 0 +} + +func Polyline(hdc HDC, p []POINT) bool { + if len(p) == 0 { + return true + } + ret, _, _ := polyline.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(&p[0])), + uintptr(len(p)), + ) + return ret != 0 +} + +func PolylineMem(hdc HDC, start unsafe.Pointer, pointCount int) bool { + ret, _, _ := polyline.Call( + uintptr(hdc), + uintptr(start), + uintptr(pointCount), + ) + return ret != 0 +} + +func PolyBezier(hdc HDC, p []POINT) bool { + if len(p) == 0 { + return true + } + ret, _, _ := polyBezier.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(&p[0])), + uintptr(len(p)), + ) + return ret != 0 +} + +func PolyBezierMem(hdc HDC, start unsafe.Pointer, pointCount int) bool { + ret, _, _ := polyline.Call( + uintptr(hdc), + uintptr(start), + uintptr(pointCount), + ) + return ret != 0 +} + +func IntersectClipRect(hdc HDC, left, top, right, bottom int) int { + ret, _, _ := intersectClipRect.Call( + uintptr(hdc), + uintptr(left), + uintptr(top), + uintptr(right), + uintptr(bottom), + ) + return int(ret) +} + +func SelectClipRgn(hdc HDC, region HRGN) int { + ret, _, _ := selectClipRgn.Call(uintptr(hdc), uintptr(region)) + return int(ret) +} + +func CreateRectRgn(x1, y1, x2, y2 int) HRGN { + ret, _, _ := createRectRgn.Call( + uintptr(x1), + uintptr(y1), + uintptr(x2), + uintptr(y2), + ) + return HRGN(ret) +} + +func CombineRgn(dest, src1, src2 HRGN, mode int) int { + ret, _, _ := combineRgn.Call( + uintptr(dest), + uintptr(src1), + uintptr(src2), + uintptr(mode), + ) + return int(ret) +} + +type FontType int + +const ( + RASTER_FONTTYPE FontType = 1 + DEVICE_FONTTYPE FontType = 2 + TRUETYPE_FONTTYPE FontType = 4 +) + +func (t FontType) String() string { + switch t { + case RASTER_FONTTYPE: + return "RASTER_FONTTYPE" + case DEVICE_FONTTYPE: + return "DEVICE_FONTTYPE" + case TRUETYPE_FONTTYPE: + return "TRUETYPE_FONTTYPE" + } + return strconv.Itoa(int(t)) +} + +func EnumFontFamiliesEx(hdc HDC, font LOGFONT, f func(font *ENUMLOGFONTEX, metric *ENUMTEXTMETRIC, fontType FontType) bool) { + callback := syscall.NewCallback(func(font, metric uintptr, typ uint32, _ uintptr) uintptr { + if f( + (*ENUMLOGFONTEX)(unsafe.Pointer(font)), + (*ENUMTEXTMETRIC)(unsafe.Pointer(metric)), + FontType(typ), + ) { + return 1 + } + return 0 + }) + enumFontFamiliesEx.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(&font)), + callback, + 0, + 0, + ) +} + +func GetModuleHandle(modulename string) HINSTANCE { + var mn uintptr + if modulename == "" { + mn = 0 + } else { + mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename))) + } + ret, _, _ := getModuleHandle.Call(mn) + return HINSTANCE(ret) +} + +func GetModuleFileName(mod HMODULE) string { + var path [32768]uint16 + ret, _, _ := getModuleFileName.Call( + uintptr(mod), + uintptr(unsafe.Pointer(&path[0])), + uintptr(len(path)), + ) + if ret == 0 { + return "" + } + return syscall.UTF16ToString(path[:]) +} + +func MulDiv(number, numerator, denominator int) int { + ret, _, _ := mulDiv.Call( + uintptr(number), + uintptr(numerator), + uintptr(denominator), + ) + return int(ret) +} + +func GetConsoleWindow() HWND { + ret, _, _ := getConsoleWindow.Call() + return HWND(ret) +} + +func GetCurrentThread() HANDLE { + ret, _, _ := getCurrentThread.Call() + return HANDLE(ret) +} + +func GetLogicalDrives() uint32 { + ret, _, _ := getLogicalDrives.Call() + return uint32(ret) +} + +func GetDriveType(drive string) uint { + ret, _, _ := getDriveType.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(drive)))) + return uint(ret) +} + +func GetUserDefaultLCID() uint32 { + ret, _, _ := getUserDefaultLCID.Call() + return uint32(ret) +} + +func Lstrlen(lpString *uint16) int { + ret, _, _ := lstrlen.Call(uintptr(unsafe.Pointer(lpString))) + return int(ret) +} + +func Lstrcpy(buf []uint16, lpString *uint16) { + lstrcpy.Call( + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(lpString)), + ) +} + +func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL { + ret, _, _ := globalAlloc.Call( + uintptr(uFlags), + uintptr(dwBytes)) + return HGLOBAL(ret) +} + +func GlobalFree(hMem HGLOBAL) { + globalFree.Call(uintptr(hMem)) +} + +func GlobalLock(hMem HGLOBAL) unsafe.Pointer { + ret, _, _ := globalLock.Call(uintptr(hMem)) + return unsafe.Pointer(ret) +} + +func GlobalUnlock(hMem HGLOBAL) bool { + ret, _, _ := globalUnlock.Call(uintptr(hMem)) + return ret != 0 +} + +func MoveMemory(destination, source unsafe.Pointer, length uint32) { + moveMemory.Call( + uintptr(unsafe.Pointer(destination)), + uintptr(source), + uintptr(length), + ) +} + +func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) { + ret, _, _ := findResource.Call( + uintptr(hModule), + uintptr(unsafe.Pointer(lpName)), + uintptr(unsafe.Pointer(lpType)), + ) + if ret == 0 { + return 0, syscall.GetLastError() + } + return HRSRC(ret), nil +} + +func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 { + ret, _, _ := sizeofResource.Call( + uintptr(hModule), + uintptr(hResInfo)) + return uint32(ret) +} + +func LockResource(hResData HGLOBAL) unsafe.Pointer { + ret, _, _ := lockResource.Call(uintptr(hResData)) + return unsafe.Pointer(ret) +} + +func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL { + ret, _, _ := loadResource.Call( + uintptr(hModule), + uintptr(hResInfo), + ) + return HGLOBAL(ret) +} + +func GetLastError() uint32 { + ret, _, _ := getLastError.Call() + return uint32(ret) +} + +func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE { + inherit := 0 + if inheritHandle { + inherit = 1 + } + ret, _, _ := openProcess.Call( + uintptr(desiredAccess), + uintptr(inherit), + uintptr(processId), + ) + return HANDLE(ret) +} + +func TerminateProcess(hProcess HANDLE, uExitCode uint) bool { + ret, _, _ := terminateProcess.Call( + uintptr(hProcess), + uintptr(uExitCode), + ) + return ret != 0 +} + +func CloseHandle(object HANDLE) bool { + ret, _, _ := closeHandle.Call(uintptr(object)) + return ret != 0 +} + +func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE { + ret, _, _ := createToolhelp32Snapshot.Call( + uintptr(flags), + uintptr(processId), + ) + if ret <= 0 { + return HANDLE(0) + } + return HANDLE(ret) +} + +func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool { + ret, _, _ := module32First.Call( + uintptr(snapshot), + uintptr(unsafe.Pointer(me)), + ) + return ret != 0 +} + +func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool { + ret, _, _ := module32Next.Call( + uintptr(snapshot), + uintptr(unsafe.Pointer(me)), + ) + return ret != 0 +} + +func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool { + ret, _, _ := getSystemTimes.Call( + uintptr(unsafe.Pointer(lpIdleTime)), + uintptr(unsafe.Pointer(lpKernelTime)), + uintptr(unsafe.Pointer(lpUserTime)), + ) + return ret != 0 +} + +func GetProcessTimes(hProcess HANDLE) (creationTime, exitTime, kernelTime, userTime FILETIME, ok bool) { + ret, _, _ := getProcessTimes.Call( + uintptr(hProcess), + uintptr(unsafe.Pointer(&creationTime)), + uintptr(unsafe.Pointer(&exitTime)), + uintptr(unsafe.Pointer(&kernelTime)), + uintptr(unsafe.Pointer(&userTime)), + ) + ok = ret != 0 + return +} + +func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO { + var csbi CONSOLE_SCREEN_BUFFER_INFO + ret, _, _ := getConsoleScreenBufferInfo.Call( + uintptr(hConsoleOutput), + uintptr(unsafe.Pointer(&csbi)), + ) + if ret == 0 { + return nil + } + return &csbi +} + +func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool { + ret, _, _ := setConsoleTextAttribute.Call( + uintptr(hConsoleOutput), + uintptr(wAttributes), + ) + return ret != 0 +} + +func GetDiskFreeSpaceEx(dirName string) (r bool, + freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) { + ret, _, _ := getDiskFreeSpaceEx.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))), + uintptr(unsafe.Pointer(&freeBytesAvailable)), + uintptr(unsafe.Pointer(&totalNumberOfBytes)), + uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)), + ) + return ret != 0, + freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes +} + +func GetSystemTime() (time SYSTEMTIME) { + getSystemTime.Call(uintptr(unsafe.Pointer(&time))) + return +} + +func GetSystemTimeAsFileTime() (time FILETIME) { + getSystemTimeAsFileTime.Call(uintptr(unsafe.Pointer(&time))) + return +} + +func SystemTimeToFileTime(sysTime SYSTEMTIME) (fileTime FILETIME, ok bool) { + ret, _, _ := systemTimeToFileTime.Call( + uintptr(unsafe.Pointer(&sysTime)), + uintptr(unsafe.Pointer(&fileTime)), + ) + ok = ret != 0 + return +} + +func FileTimeToSystemTime(fileTime FILETIME) (sysTime SYSTEMTIME, ok bool) { + ret, _, _ := fileTimeToSystemTime.Call( + uintptr(unsafe.Pointer(&fileTime)), + uintptr(unsafe.Pointer(&sysTime)), + ) + ok = ret != 0 + return +} + +func SetSystemTime(time SYSTEMTIME) bool { + ret, _, _ := setSystemTime.Call(uintptr(unsafe.Pointer(&time))) + return ret != 0 +} + +func SetLocalTime(time SYSTEMTIME) bool { + ret, _, _ := setLocalTime.Call(uintptr(unsafe.Pointer(&time))) + return ret != 0 +} + +func CopyMemory(dest, source unsafe.Pointer, sizeInBytes int) { + copyMemory.Call( + uintptr(dest), + uintptr(source), + uintptr(sizeInBytes), + ) +} + +func GetCurrentProcess() HANDLE { + id, _, _ := getCurrentProcess.Call() + return HANDLE(id) +} + +func GetCurrentProcessId() DWORD { + id, _, _ := getCurrentProcessId.Call() + return DWORD(id) +} + +func GetVersion() uint32 { + ret, _, _ := getVersion.Call() + return uint32(ret) +} + +func SetEnvironmentVariable(name, value string) bool { + ret, _, _ := setEnvironmentVariable.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + ) + return ret != 0 +} + +func GetComputerName() string { + const maxLen = 128 + var buf [maxLen]uint16 + var size uint32 = maxLen + ret, _, _ := getComputerName.Call( + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&size)), + ) + if ret != 0 { + return syscall.UTF16ToString(buf[:]) + } + return "" +} + +func ActivateActCtx(ctx HANDLE) (uintptr, bool) { + var cookie uintptr + ret, _, _ := activateActCtx.Call( + uintptr(ctx), + uintptr(unsafe.Pointer(&cookie)), + ) + return cookie, ret != 0 +} + +func CreateActCtx(ctx *ACTCTX) HANDLE { + if ctx != nil { + ctx.size = uint32(unsafe.Sizeof(*ctx)) + } + ret, _, _ := createActCtx.Call(uintptr(unsafe.Pointer(ctx))) + return HANDLE(ret) +} + +func GetCurrentActCtx() (HANDLE, bool) { + var h HANDLE + ret, _, _ := getCurrentActCtx.Call(uintptr(unsafe.Pointer(&h))) + return h, ret != 0 +} + +func SetErrorMode(mode uint) uint { + ret, _, _ := setErrorMode.Call(uintptr(mode)) + return uint(ret) +} + +func CreateFile( + filename string, + access uint32, + shareMode uint32, + security *SECURITY_ATTRIBUTES, + disposition uint32, + flags uint32, + templateFile HANDLE, +) HANDLE { + ret, _, _ := createFile.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))), + uintptr(access), + uintptr(shareMode), + uintptr(unsafe.Pointer(security)), + uintptr(disposition), + uintptr(flags), + uintptr(templateFile), + ) + return HANDLE(ret) +} + +func DeviceIoControl( + dev HANDLE, + controlCode uint32, + inBuffer unsafe.Pointer, + inBufferSize uint32, + outBuffer unsafe.Pointer, + outBufferSize uint32, + overlapped *OVERLAPPED, +) (outBufWrittenBytes uint32, ok bool) { + ret, _, _ := deviceIoControl.Call( + uintptr(dev), + uintptr(controlCode), + uintptr(inBuffer), + uintptr(inBufferSize), + uintptr(outBuffer), + uintptr(outBufferSize), + uintptr(unsafe.Pointer(&outBufWrittenBytes)), + uintptr(unsafe.Pointer(overlapped)), + ) + ok = ret != 0 + return +} + +func FindFirstStream(filename string, data *WIN32_FIND_STREAM_DATA) (HANDLE, bool) { + ret, _, _ := findFirstStream.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))), + FindStreamInfoStandard, + uintptr(unsafe.Pointer(data)), + 0, + ) + h := HANDLE(ret) + return h, h != INVALID_HANDLE_VALUE +} + +func FindNextStream(finder HANDLE, data *WIN32_FIND_STREAM_DATA) bool { + ret, _, _ := findNextStream.Call( + uintptr(finder), + uintptr(unsafe.Pointer(data)), + ) + return ret != 0 +} + +func FindClose(finder HANDLE) bool { + ret, _, _ := findClose.Call( + uintptr(finder), + ) + return ret != 0 +} + +func OpenMutex(desiredAccess uint32, inheritHandle bool, name string) HANDLE { + ret, _, _ := openMutex.Call( + uintptr(desiredAccess), + uintptr(BoolToBOOL(inheritHandle)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))), + ) + return HANDLE(ret) +} + +func CreateMutex(attributes *SECURITY_ATTRIBUTES, initialOwner bool, name string) HANDLE { + ret, _, _ := createMutex.Call( + uintptr(unsafe.Pointer(attributes)), + uintptr(BoolToBOOL(initialOwner)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))), + ) + return HANDLE(ret) +} + +func CoInitializeEx(coInit uint32) HRESULT { + ret, _, _ := coInitializeEx.Call(0, uintptr(coInit)) + return HRESULT(ret) +} + +func CoInitialize() { + coInitialize.Call(0) +} + +func CoUninitialize() { + coUninitialize.Call() +} + +func CreateStreamOnHGlobal(global HGLOBAL, deleteOnRelease bool) (*IStream, HRESULT) { + stream := new(IStream) + ret, _, _ := createStreamOnHGlobal.Call( + uintptr(global), + uintptr(BoolToBOOL(deleteOnRelease)), + uintptr(unsafe.Pointer(&stream)), + ) + + return stream, HRESULT(ret) +} + +func VariantInit(v *VARIANT) { + variantInit.Call(uintptr(unsafe.Pointer(v))) +} + +func SysAllocString(v string) (ss *int16) { + pss, _, _ := sysAllocString.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))), + ) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +func SysFreeString(v *int16) { + sysFreeString.Call(uintptr(unsafe.Pointer(v))) +} + +func SysStringLen(v *int16) uint { + l, _, _ := sysStringLen.Call(uintptr(unsafe.Pointer(v))) + return uint(l) +} + +func WglCreateContext(hdc HDC) HGLRC { + ret, _, _ := wglCreateContext.Call( + uintptr(hdc), + ) + return HGLRC(ret) +} + +func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC { + ret, _, _ := wglCreateLayerContext.Call( + uintptr(hdc), + uintptr(iLayerPlane), + ) + return HGLRC(ret) +} + +func WglDeleteContext(hglrc HGLRC) bool { + ret, _, _ := wglDeleteContext.Call( + uintptr(hglrc), + ) + return ret == TRUE +} + +func WglGetProcAddress(szProc string) uintptr { + ret, _, _ := wglGetProcAddress.Call( + uintptr(unsafe.Pointer(syscall.StringBytePtr(szProc))), + ) + return ret +} + +func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool { + ret, _, _ := wglMakeCurrent.Call( + uintptr(hdc), + uintptr(hglrc), + ) + return ret == TRUE +} + +func WglShareLists(hglrc1, hglrc2 HGLRC) bool { + ret, _, _ := wglShareLists.Call( + uintptr(hglrc1), + uintptr(hglrc2), + ) + return ret == TRUE +} + +// EnumAllProcesses retrieves the process identifier for each process object in +// the system. It returns ok = true on success. If ok = false call GetLastError +// to see why it failed. +func EnumAllProcesses() (processIDs []uint32, ok bool) { + n := 128 + for { + processIDs, ok = EnumProcesses(make([]uint32, n)) + if !ok || len(processIDs) < n { + return + } + n *= 2 + } +} + +// EnumProcesses retrieves the process identifier for each process object in the +// system. It takes a pre-sized slice to fill and returns the filled sub-slice +// and an OK status to report success. If ok is false, call GetLastError to see +// what the problem was. +// If the given slice is filled completely, there might be more unenumerated +// process IDs. In that case increase the buffer size and call EnumProcesses +// again. You can also call EnumAllProcesses which does this automatically. +func EnumProcesses(into []uint32) (processIDs []uint32, ok bool) { + if len(into) == 0 { + return nil, true + } + var writtenBytes uint32 + ret, _, _ := enumProcesses.Call( + uintptr(unsafe.Pointer(&into[0])), + uintptr(len(into)*4), + uintptr(unsafe.Pointer(&writtenBytes)), + ) + writtenIDs := writtenBytes / 4 + return into[:writtenIDs], ret != 0 +} + +func SHBrowseForFolder(bi *BROWSEINFO) uintptr { + ret, _, _ := sHBrowseForFolder.Call(uintptr(unsafe.Pointer(bi))) + return ret +} + +func SHGetPathFromIDList(idl uintptr) string { + buf := make([]uint16, 1024) + sHGetPathFromIDList.Call( + idl, + uintptr(unsafe.Pointer(&buf[0])), + ) + return syscall.UTF16ToString(buf) +} + +func SHGetSpecialFolderPath(window HWND, id int, create bool) (string, bool) { + var buf [MAX_PATH]uint16 + ret, _, _ := shGetSpecialFolderPath.Call( + uintptr(window), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(id), + uintptr(BoolToBOOL(create)), + ) + return syscall.UTF16ToString(buf[:]), ret != 0 +} + +func DragAcceptFiles(hwnd HWND, accept bool) { + dragAcceptFiles.Call( + uintptr(hwnd), + uintptr(BoolToBOOL(accept)), + ) +} + +func DragQueryFile(drop HDROP, file uint) string { + ret, _, _ := dragQueryFile.Call( + uintptr(drop), + uintptr(file), + 0, + 0, + ) + + stringSize := uint(ret) + var fileName string + + if file != 0xFFFFFFFF { + buf := make([]uint16, stringSize+1) + + ret, _, _ := dragQueryFile.Call( + uintptr(drop), + uintptr(file), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(len(buf)), + ) + if ret != 0 { + fileName = syscall.UTF16ToString(buf) + } + } + + return fileName +} + +func DragQueryPoint(hDrop HDROP) (x, y int, isClientArea bool) { + var pt POINT + ret, _, _ := dragQueryPoint.Call( + uintptr(hDrop), + uintptr(unsafe.Pointer(&pt)), + ) + return int(pt.X), int(pt.Y), (ret == 1) +} + +func DragFinish(hDrop HDROP) { + dragFinish.Call(uintptr(hDrop)) +} + +func ShellExecute(hwnd HWND, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd int) error { + var op, param, directory uintptr + if len(lpOperation) != 0 { + op = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpOperation))) + } + if len(lpParameters) != 0 { + param = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpParameters))) + } + if len(lpDirectory) != 0 { + directory = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDirectory))) + } + + ret, _, _ := shellExecute.Call( + uintptr(hwnd), + op, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpFile))), + param, + directory, + uintptr(nShowCmd)) + + errorMsg := "" + if ret != 0 && ret <= 32 { + switch int(ret) { + case ERROR_FILE_NOT_FOUND: + errorMsg = "The specified file was not found." + case ERROR_PATH_NOT_FOUND: + errorMsg = "The specified path was not found." + case ERROR_BAD_FORMAT: + errorMsg = "The .exe file is invalid (non-Win32 .exe or error in .exe image)." + case SE_ERR_ACCESSDENIED: + errorMsg = "The operating system denied access to the specified file." + case SE_ERR_ASSOCINCOMPLETE: + errorMsg = "The file name association is incomplete or invalid." + case SE_ERR_DDEBUSY: + errorMsg = "The DDE transaction could not be completed because other DDE transactions were being processed." + case SE_ERR_DDEFAIL: + errorMsg = "The DDE transaction failed." + case SE_ERR_DDETIMEOUT: + errorMsg = "The DDE transaction could not be completed because the request timed out." + case SE_ERR_DLLNOTFOUND: + errorMsg = "The specified DLL was not found." + case SE_ERR_NOASSOC: + errorMsg = "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable." + case SE_ERR_OOM: + errorMsg = "There was not enough memory to complete the operation." + case SE_ERR_SHARE: + errorMsg = "A sharing violation occurred." + default: + errorMsg = fmt.Sprintf("Unknown error occurred with error code %v", ret) + } + } else { + return nil + } + + return errors.New(errorMsg) +} + +func ExtractIcon(lpszExeFileName string, nIconIndex int) HICON { + ret, _, _ := extractIcon.Call( + 0, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszExeFileName))), + uintptr(nIconIndex), + ) + return HICON(ret) +} + +func GetGpStatus(s int32) string { + switch s { + case Ok: + return "Ok" + case GenericError: + return "GenericError" + case InvalidParameter: + return "InvalidParameter" + case OutOfMemory: + return "OutOfMemory" + case ObjectBusy: + return "ObjectBusy" + case InsufficientBuffer: + return "InsufficientBuffer" + case NotImplemented: + return "NotImplemented" + case Win32Error: + return "Win32Error" + case WrongState: + return "WrongState" + case Aborted: + return "Aborted" + case FileNotFound: + return "FileNotFound" + case ValueOverflow: + return "ValueOverflow" + case AccessDenied: + return "AccessDenied" + case UnknownImageFormat: + return "UnknownImageFormat" + case FontFamilyNotFound: + return "FontFamilyNotFound" + case FontStyleNotFound: + return "FontStyleNotFound" + case NotTrueTypeFont: + return "NotTrueTypeFont" + case UnsupportedGdiplusVersion: + return "UnsupportedGdiplusVersion" + case GdiplusNotInitialized: + return "GdiplusNotInitialized" + case PropertyNotFound: + return "PropertyNotFound" + case PropertyNotSupported: + return "PropertyNotSupported" + case ProfileNotFound: + return "ProfileNotFound" + } + return "Unknown Status Value" +} + +func GdipCreateBitmapFromFile(filename string) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := gdipCreateBitmapFromFile.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))), + uintptr(unsafe.Pointer(&bitmap)), + ) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf( + "GdipCreateBitmapFromFile failed with status '%s' for file '%s'", + GetGpStatus(int32(ret)), + filename, + )) + } + + return bitmap, nil +} + +func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := gdipCreateBitmapFromResource.Call( + uintptr(instance), + uintptr(unsafe.Pointer(resId)), + uintptr(unsafe.Pointer(&bitmap)), + ) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return bitmap, nil +} + +func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := gdipCreateBitmapFromStream.Call( + uintptr(unsafe.Pointer(stream)), + uintptr(unsafe.Pointer(&bitmap)), + ) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return bitmap, nil +} + +func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) { + var hbitmap HBITMAP + ret, _, _ := gdipCreateHBITMAPFromBitmap.Call( + uintptr(unsafe.Pointer(bitmap)), + uintptr(unsafe.Pointer(&hbitmap)), + uintptr(background), + ) + + if ret != Ok { + return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return hbitmap, nil +} + +func GdipDisposeImage(image *uintptr) { + gdipDisposeImage.Call(uintptr(unsafe.Pointer(image))) +} + +func GdiplusShutdown(token uintptr) { + gdiplusShutdown.Call(token) +} + +func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) (token uintptr, status uint32) { + ret, _, _ := gdiplusStartup.Call( + uintptr(unsafe.Pointer(&token)), + uintptr(unsafe.Pointer(input)), + uintptr(unsafe.Pointer(output)), + ) + status = uint32(ret) + return +} + +func MakeIntResource(id uint16) *uint16 { + return (*uint16)(unsafe.Pointer(uintptr(id))) +} + +func LOWORD(dw uint32) uint16 { + return uint16(dw) +} + +func HIWORD(dw uint32) uint16 { + return uint16(dw >> 16 & 0xffff) +} + +func BoolToBOOL(value bool) BOOL { + if value { + return 1 + } + return 0 +} + +func GetFileVersionInfoSize(path string) uint32 { + ret, _, _ := getFileVersionInfoSize.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))), + 0, + ) + return uint32(ret) +} + +func GetFileVersionInfo(path string, data []byte) bool { + ret, _, _ := getFileVersionInfo.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(path))), + 0, + uintptr(len(data)), + uintptr(unsafe.Pointer(&data[0])), + ) + return ret != 0 +} + +// VerQueryValueRoot calls VerQueryValue +// (https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx) +// with `\` (root) to retieve the VS_FIXEDFILEINFO. +func VerQueryValueRoot(block []byte) (VS_FIXEDFILEINFO, bool) { + var offset uintptr + var length uint + blockStart := uintptr(unsafe.Pointer(&block[0])) + ret, _, _ := verQueryValue.Call( + blockStart, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(`\`))), + uintptr(unsafe.Pointer(&offset)), + uintptr(unsafe.Pointer(&length)), + ) + if ret == 0 { + return VS_FIXEDFILEINFO{}, false + } + start := int(offset) - int(blockStart) + end := start + int(length) + if start < 0 || start >= len(block) || end < start || end > len(block) { + return VS_FIXEDFILEINFO{}, false + } + data := block[start:end] + info := *((*VS_FIXEDFILEINFO)(unsafe.Pointer(&data[0]))) + return info, true +} + +// VerQueryValueTranslations calls VerQueryValue +// (https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx) +// with `\VarFileInfo\Translation` to retrieve a list of 4-character translation +// strings as required by VerQueryValueString. +func VerQueryValueTranslations(block []byte) ([]string, bool) { + var offset uintptr + var length uint + blockStart := uintptr(unsafe.Pointer(&block[0])) + ret, _, _ := verQueryValue.Call( + blockStart, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(`\VarFileInfo\Translation`))), + uintptr(unsafe.Pointer(&offset)), + uintptr(unsafe.Pointer(&length)), + ) + if ret == 0 { + return nil, false + } + start := int(offset) - int(blockStart) + end := start + int(length) + if start < 0 || start >= len(block) || end < start || end > len(block) { + return nil, false + } + data := block[start:end] + // each translation consists of a 16-bit language ID and a 16-bit code page + // ID, so each entry has 4 bytes + if len(data)%4 != 0 { + return nil, false + } + trans := make([]string, len(data)/4) + for i := range trans { + t := data[i*4 : (i+1)*4] + // handle endianness of the 16-bit values + t[0], t[1] = t[1], t[0] + t[2], t[3] = t[3], t[2] + trans[i] = fmt.Sprintf("%x", t) + } + return trans, true +} + +// these constants can be passed to VerQueryValueString as the item +const ( + CompanyName = "CompanyName" + FileDescription = "FileDescription" + FileVersion = "FileVersion" + LegalCopyright = "LegalCopyright" + LegalTrademarks = "LegalTrademarks" + OriginalFilename = "OriginalFilename" + ProductVersion = "ProductVersion" + PrivateBuild = "PrivateBuild" + SpecialBuild = "SpecialBuild" +) + +// VerQueryValueString calls VerQueryValue +// (https://msdn.microsoft.com/en-us/library/windows/desktop/ms647464(v=vs.85).aspx) +// with `\StringFileInfo\...` to retrieve a specific piece of information as +// string in a specific translation. +func VerQueryValueString(block []byte, translation, item string) (string, bool) { + var offset uintptr + var utf16Length uint + blockStart := uintptr(unsafe.Pointer(&block[0])) + id := `\StringFileInfo\` + translation + `\` + item + ret, _, _ := verQueryValue.Call( + blockStart, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(id))), + uintptr(unsafe.Pointer(&offset)), + uintptr(unsafe.Pointer(&utf16Length)), + ) + if ret == 0 { + return "", false + } + start := int(offset) - int(blockStart) + end := start + int(2*utf16Length) + if start < 0 || start >= len(block) || end < start || end > len(block) { + return "", false + } + data := block[start:end] + u16 := make([]uint16, utf16Length) + for i := range u16 { + u16[i] = uint16(data[i*2+1])<<8 | uint16(data[i*2+0]) + } + return syscall.UTF16ToString(u16), true +} + +func PlaySound(sound string, mod HMODULE, flags uint32) bool { + return PlaySoundPointer(syscall.StringToUTF16Ptr(sound), mod, flags) +} + +func PlaySoundPointer(sound *uint16, mod HMODULE, flags uint32) bool { + ret, _, _ := playSound.Call( + uintptr(unsafe.Pointer(sound)), + uintptr(mod), + uintptr(flags), + ) + return ret != 0 +} + +func GetMonitorBrightness(monitor HANDLE) (ok bool, min, cur, max DWORD) { + ret, _, _ := getMonitorBrightness.Call( + uintptr(monitor), + uintptr(unsafe.Pointer(&min)), + uintptr(unsafe.Pointer(&cur)), + uintptr(unsafe.Pointer(&max)), + ) + ok = ret != 0 + return +} + +func SetMonitorBrightness(monitor HANDLE, value DWORD) bool { + ret, _, _ := setMonitorBrightness.Call( + uintptr(monitor), + uintptr(value), + ) + return ret != 0 +} + +func GetNumberOfPhysicalMonitorsFromHMONITOR(monitor HMONITOR) (bool, DWORD) { + var n DWORD + ret, _, _ := getNumberOfPhysicalMonitorsFromHMONITOR.Call( + uintptr(monitor), + uintptr(unsafe.Pointer(&n)), + ) + return ret != 0, n +} + +// len(buf) must not be 0. +func GetPhysicalMonitorsFromHMONITOR(monitor HMONITOR, buf []PHYSICAL_MONITOR) bool { + ret, _, _ := getPhysicalMonitorsFromHMONITOR.Call( + uintptr(monitor), + uintptr(len(buf)), + uintptr(unsafe.Pointer(&buf[0])), + ) + return ret != 0 +} + +func MAKEWPARAM(low, high uint16) uintptr { + return uintptr(low) | uintptr(high)<<16 +} + +func MAKELPARAM(low, high uint16) uintptr { + return MAKEWPARAM(low, high) +} + +func AlphaBlend( + dest HDC, destX, destY, destW, destH int, + src HDC, srcX, srcY, srcW, srcH int, + f BLENDFUNC, +) bool { + ret, _, _ := alphaBlend.Call( + uintptr(dest), + uintptr(destX), + uintptr(destY), + uintptr(destW), + uintptr(destH), + uintptr(src), + uintptr(srcX), + uintptr(srcY), + uintptr(srcW), + uintptr(srcH), + uintptr(*((*uintptr)(unsafe.Pointer(&f)))), + ) + return ret != 0 +} + +func WNetAddConnection2(rsc *NETRESOURCE, pass, user string, flags uint32) uint32 { + var resource *netresource + if rsc != nil { + resource = rsc.toInternal() + } + ret, _, _ := wNetAddConnection2.Call( + uintptr(unsafe.Pointer(resource)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(pass))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(user))), + uintptr(flags), + ) + return uint32(ret) +} + +func WNetAddConnection3(owner HWND, rsc *NETRESOURCE, pass, user string, flags uint32) uint32 { + var resource *netresource + if rsc != nil { + resource = rsc.toInternal() + } + ret, _, _ := wNetAddConnection3.Call( + uintptr(owner), + uintptr(unsafe.Pointer(resource)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(pass))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(user))), + uintptr(flags), + ) + return uint32(ret) +} + +func WNetCancelConnection2(name string, flags uint32, force bool) uint32 { + ret, _, _ := wNetCancelConnection2.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(name))), + uintptr(flags), + uintptr(BoolToBOOL(force)), + ) + return uint32(ret) +} + +// https://docs.microsoft.com/en-us/windows/win32/devnotes/rtlgetversion +func RtlGetVersion() RTL_OSVERSIONINFOEXW { + var info RTL_OSVERSIONINFOEXW + info.OSVersionInfoSize = 5*4 + 128*2 + 3*2 + 2*1 + rtlGetVersion.Call(uintptr(unsafe.Pointer(&info))) + return info +} + +// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getnativesysteminfo +func GetNativeSystemInfo() SYSTEM_INFO { + var info SYSTEM_INFO + getNativeSystemInfo.Call(uintptr(unsafe.Pointer(&info))) + return info +} + +// https://docs.microsoft.com/en-us/windows/win32/api/setupapi/nf-setupapi-setupdigetclassdevsw +func SetupDiGetClassDevs(classGUID *GUID, flags uint32) HANDLE { + ret, _, _ := setupDiGetClassDevs.Call( + uintptr(unsafe.Pointer(classGUID)), + 0, + 0, + uintptr(flags), + ) + return HANDLE(ret) +} + +func SetupDiDestroyDeviceInfoList(list HANDLE) bool { + ret, _, _ := setupDiDestroyDeviceInfoList.Call(uintptr(list)) + return ret != 0 +} + +func SetupDiEnumDeviceInfo(deviceInfoList HANDLE, index uint32) (SP_DEVINFO_DATA, bool) { + var data SP_DEVINFO_DATA + data.Size = uint32(unsafe.Sizeof(data)) + ret, _, _ := setupDiEnumDeviceInfo.Call( + uintptr(deviceInfoList), + uintptr(index), + uintptr(unsafe.Pointer(&data)), + ) + return data, ret != 0 +} + +func SetupDiOpenDevRegKey( + DeviceInfoList HANDLE, + data *SP_DEVINFO_DATA, + scope, hwProfile, keyType, access uint32, +) HKEY { + ret, _, _ := setupDiOpenDevRegKey.Call( + uintptr(DeviceInfoList), + uintptr(unsafe.Pointer(data)), + uintptr(scope), + uintptr(hwProfile), + uintptr(keyType), + uintptr(access), + ) + return HKEY(ret) +} + +func SetProcessDpiAwareness(value int) HRESULT { + ret, _, _ := setProcessDpiAwareness.Call(uintptr(value)) + return HRESULT(ret) +} diff --git a/v3/internal/w32/functions_386.go b/v3/internal/w32/functions_386.go new file mode 100644 index 00000000..968cafec --- /dev/null +++ b/v3/internal/w32/functions_386.go @@ -0,0 +1,29 @@ +package w32 + +// MenuItemFromPoint determines which menu item, if any, is at the specified +// location. +func MenuItemFromPoint(w HWND, m HMENU, screen POINT) int { + ret, _, _ := menuItemFromPoint.Call( + uintptr(w), + uintptr(m), + uintptr(screen.X), + uintptr(screen.Y), + ) + return int(ret) +} + +func GetClassLongPtr(w HWND, index int) uintptr { + return uintptr(GetClassLong(w, index)) +} + +func SetClassLongPtr(w HWND, index int, value uintptr) uintptr { + return uintptr(SetClassLong(w, index, int32(value))) +} + +func GetWindowLongPtr(hwnd HWND, index int) uintptr { + return uintptr(GetWindowLong(hwnd, index)) +} + +func SetWindowLongPtr(hwnd HWND, index int, value uintptr) uintptr { + return uintptr(SetWindowLong(hwnd, index, int32(value))) +} diff --git a/v3/internal/w32/functions_amd64.go b/v3/internal/w32/functions_amd64.go new file mode 100644 index 00000000..0e12a621 --- /dev/null +++ b/v3/internal/w32/functions_amd64.go @@ -0,0 +1,43 @@ +package w32 + +// MenuItemFromPoint determines which menu item, if any, is at the specified +// location. +func MenuItemFromPoint(w HWND, m HMENU, screen POINT) int { + ret, _, _ := menuItemFromPoint.Call( + uintptr(w), + uintptr(m), + uintptr(uint64(screen.X)<<32|uint64(screen.Y)), + ) + return int(ret) +} + +func GetClassLongPtr(w HWND, index int) uintptr { + ret, _, _ := getClassLongPtr.Call(uintptr(w), uintptr(index)) + return ret +} + +func SetClassLongPtr(w HWND, index int, value uintptr) uintptr { + ret, _, _ := setClassLongPtr.Call( + uintptr(w), + uintptr(index), + value, + ) + return ret +} + +func GetWindowLongPtr(hwnd HWND, index int) uintptr { + ret, _, _ := getWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index), + ) + return ret +} + +func SetWindowLongPtr(hwnd HWND, index int, value uintptr) uintptr { + ret, _, _ := setWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index), + value, + ) + return ret +} diff --git a/v3/internal/w32/functions_arm64.go b/v3/internal/w32/functions_arm64.go new file mode 100644 index 00000000..0e12a621 --- /dev/null +++ b/v3/internal/w32/functions_arm64.go @@ -0,0 +1,43 @@ +package w32 + +// MenuItemFromPoint determines which menu item, if any, is at the specified +// location. +func MenuItemFromPoint(w HWND, m HMENU, screen POINT) int { + ret, _, _ := menuItemFromPoint.Call( + uintptr(w), + uintptr(m), + uintptr(uint64(screen.X)<<32|uint64(screen.Y)), + ) + return int(ret) +} + +func GetClassLongPtr(w HWND, index int) uintptr { + ret, _, _ := getClassLongPtr.Call(uintptr(w), uintptr(index)) + return ret +} + +func SetClassLongPtr(w HWND, index int, value uintptr) uintptr { + ret, _, _ := setClassLongPtr.Call( + uintptr(w), + uintptr(index), + value, + ) + return ret +} + +func GetWindowLongPtr(hwnd HWND, index int) uintptr { + ret, _, _ := getWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index), + ) + return ret +} + +func SetWindowLongPtr(hwnd HWND, index int, value uintptr) uintptr { + ret, _, _ := setWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index), + value, + ) + return ret +} diff --git a/v3/internal/w32/types.go b/v3/internal/w32/types.go new file mode 100644 index 00000000..7f27bc9b --- /dev/null +++ b/v3/internal/w32/types.go @@ -0,0 +1,1297 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "time" + "unicode/utf16" + "unsafe" +) + +// From MSDN: Windows Data Types +// http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx +type ( + ATOM uint16 + BOOL int32 + COLORREF uint32 + DWM_FRAME_COUNT uint64 + DWORD uint32 + HACCEL HANDLE + HANDLE uintptr + HBITMAP HANDLE + HBRUSH HANDLE + HCURSOR HANDLE + HDC HANDLE + HDROP HANDLE + HDWP HANDLE + HENHMETAFILE HANDLE + HFONT HANDLE + HGDIOBJ HANDLE + HGLOBAL HANDLE + HGLRC HANDLE + HHOOK HANDLE + HICON HANDLE + HIMAGELIST HANDLE + HINSTANCE HANDLE + HKEY HANDLE + HKL HANDLE + HMENU HANDLE + HMODULE HANDLE + HMONITOR HANDLE + HPEN HANDLE + HRESULT int32 + HRGN HANDLE + HRSRC HANDLE + HTHUMBNAIL HANDLE + HWND HANDLE + LPARAM uintptr + LPCVOID unsafe.Pointer + LRESULT uintptr + PVOID unsafe.Pointer + QPC_TIME uint64 + ULONG_PTR uintptr + WPARAM uintptr + HRAWINPUT HANDLE +) + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx +type POINT struct { + X, Y int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162897.aspx +type RECT struct { + Left, Top, Right, Bottom int32 +} + +func (r *RECT) Width() int32 { + return r.Right - r.Left +} + +func (r *RECT) Height() int32 { + return r.Bottom - r.Top +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx +type WNDCLASSEX struct { + Size uint32 + Style uint32 + WndProc uintptr + ClsExtra int32 + WndExtra int32 + Instance HINSTANCE + Icon HICON + Cursor HCURSOR + Background HBRUSH + MenuName *uint16 + ClassName *uint16 + IconSm HICON +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx +type MSG struct { + Hwnd HWND + Message uint32 + WParam uintptr + LParam uintptr + Time uint32 + Pt POINT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037.aspx +type LOGFONT struct { + Height int32 + Width int32 + Escapement int32 + Orientation int32 + Weight int32 + Italic byte + Underline byte + StrikeOut byte + CharSet byte + OutPrecision byte + ClipPrecision byte + Quality byte + PitchAndFamily byte + FaceName [LF_FACESIZE]uint16 +} + +func toString(s []uint16) string { + for i, c := range s { + if c == 0 { + return string(utf16.Decode(s[:i])) + } + } + return string(utf16.Decode(s)) +} + +func (f *LOGFONT) GetFaceName() string { + return toString(f.FaceName[:]) +} + +func (f *LOGFONT) SetFaceName(name string) { + s := utf16.Encode([]rune(name)) + max := len(f.FaceName) - 1 + if len(s) > max { + s = s[:max] + } + copy(f.FaceName[:], s) + f.FaceName[len(s)] = 0 +} + +type ENUMLOGFONTEX struct { + LOGFONT + FullName [LF_FULLFACESIZE]uint16 + Style [LF_FACESIZE]uint16 + Script [LF_FACESIZE]uint16 +} + +func (f *ENUMLOGFONTEX) GetFullName() string { + return toString(f.FullName[:]) +} + +func (f *ENUMLOGFONTEX) GetStyle() string { + return toString(f.Style[:]) +} + +func (f *ENUMLOGFONTEX) GetScript() string { + return toString(f.Script[:]) +} + +type ENUMTEXTMETRIC struct { + NEWTEXTMETRICEX + AXESLIST +} + +type NEWTEXTMETRICEX struct { + NEWTEXTMETRIC + FONTSIGNATURE +} + +type NEWTEXTMETRIC struct { + Height int32 + Ascent int32 + Descent int32 + InternalLeading int32 + ExternalLeading int32 + AveCharWidth int32 + MaxCharWidth int32 + Weight int32 + Overhang int32 + DigitizedAspectX int32 + DigitizedAspectY int32 + FirstChar uint16 + LastChar uint16 + DefaultChar uint16 + BreakChar uint16 + Italic byte + Underlined byte + StruckOut byte + PitchAndFamily byte + CharSet byte + Flags uint32 + SizeEM uint32 + CellHeight uint32 + AvgWidth uint32 +} + +type FONTSIGNATURE struct { + Usb [4]uint32 + Csb [2]uint32 +} + +type AXESLIST struct { + Reserved uint32 + NumAxes uint32 + AxisInfo [MM_MAX_NUMAXES]AXISINFO +} + +type AXISINFO struct { + MinValue int32 + MaxValue int32 + AxisName [MM_MAX_AXES_NAMELEN]uint16 +} + +func (i *AXISINFO) GetAxisName() string { + return toString(i.AxisName[:]) +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx +type OPENFILENAME struct { + StructSize uint32 + Owner HWND + Instance HINSTANCE + Filter *uint16 + CustomFilter *uint16 + MaxCustomFilter uint32 + FilterIndex uint32 + File *uint16 + MaxFile uint32 + FileTitle *uint16 + MaxFileTitle uint32 + InitialDir *uint16 + Title *uint16 + Flags uint32 + FileOffset uint16 + FileExtension uint16 + DefExt *uint16 + CustData uintptr + FnHook uintptr + TemplateName *uint16 + PvReserved unsafe.Pointer + DwReserved uint32 + FlagsEx uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205.aspx +type BROWSEINFO struct { + Owner HWND + Root *uint16 + DisplayName *uint16 + Title *uint16 + Flags uint32 + CallbackFunc uintptr + LParam uintptr + Image int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627.aspx +type VARIANT struct { + VT uint16 // 2 + WReserved1 uint16 // 4 + WReserved2 uint16 // 6 + WReserved3 uint16 // 8 + Val int64 // 16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221416.aspx +type DISPPARAMS struct { + Rgvarg uintptr + RgdispidNamedArgs uintptr + CArgs uint32 + CNamedArgs uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221133.aspx +type EXCEPINFO struct { + WCode uint16 + WReserved uint16 + BstrSource *uint16 + BstrDescription *uint16 + BstrHelpFile *uint16 + DwHelpContext uint32 + PvReserved uintptr + PfnDeferredFillIn uintptr + Scode int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145035.aspx +type LOGBRUSH struct { + LbStyle uint32 + LbColor COLORREF + LbHatch uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx +type DEVMODE struct { + DmDeviceName [CCHDEVICENAME]uint16 + DmSpecVersion uint16 + DmDriverVersion uint16 + DmSize uint16 + DmDriverExtra uint16 + DmFields uint32 + DmOrientation int16 + DmPaperSize int16 + DmPaperLength int16 + DmPaperWidth int16 + DmScale int16 + DmCopies int16 + DmDefaultSource int16 + DmPrintQuality int16 + DmColor int16 + DmDuplex int16 + DmYResolution int16 + DmTTOption int16 + DmCollate int16 + DmFormName [CCHFORMNAME]uint16 + DmLogPixels uint16 + DmBitsPerPel uint32 + DmPelsWidth uint32 + DmPelsHeight uint32 + DmDisplayFlags uint32 + DmDisplayFrequency uint32 + DmICMMethod uint32 + DmICMIntent uint32 + DmMediaType uint32 + DmDitherType uint32 + DmReserved1 uint32 + DmReserved2 uint32 + DmPanningWidth uint32 + DmPanningHeight uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx +type BITMAPINFOHEADER struct { + BiSize uint32 + BiWidth int32 + BiHeight int32 + BiPlanes uint16 + BiBitCount uint16 + BiCompression uint32 + BiSizeImage uint32 + BiXPelsPerMeter int32 + BiYPelsPerMeter int32 + BiClrUsed uint32 + BiClrImportant uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162938.aspx +type RGBQUAD struct { + RgbBlue byte + RgbGreen byte + RgbRed byte + RgbReserved byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183375.aspx +type BITMAPINFO struct { + BmiHeader BITMAPINFOHEADER + BmiColors *RGBQUAD +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371.aspx +type BITMAP struct { + BmType int32 + BmWidth int32 + BmHeight int32 + BmWidthBytes int32 + BmPlanes uint16 + BmBitsPixel uint16 + BmBits unsafe.Pointer +} + +// https://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx +type BITMAPFILEHEADER struct { + BfType uint16 + BfSize uint32 + BfReserved1 uint16 + BfReserved2 uint16 + BfOffBits uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183567.aspx +type DIBSECTION struct { + DsBm BITMAP + DsBmih BITMAPINFOHEADER + DsBitfields [3]uint32 + DshSection HANDLE + DsOffset uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162607.aspx +type ENHMETAHEADER struct { + IType uint32 + NSize uint32 + RclBounds RECT + RclFrame RECT + DSignature uint32 + NVersion uint32 + NBytes uint32 + NRecords uint32 + NHandles uint16 + SReserved uint16 + NDescription uint32 + OffDescription uint32 + NPalEntries uint32 + SzlDevice SIZE + SzlMillimeters SIZE + CbPixelFormat uint32 + OffPixelFormat uint32 + BOpenGL uint32 + SzlMicrometers SIZE +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145106.aspx +type SIZE struct { + CX, CY int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145132.aspx +type TEXTMETRIC struct { + TmHeight int32 + TmAscent int32 + TmDescent int32 + TmInternalLeading int32 + TmExternalLeading int32 + TmAveCharWidth int32 + TmMaxCharWidth int32 + TmWeight int32 + TmOverhang int32 + TmDigitizedAspectX int32 + TmDigitizedAspectY int32 + TmFirstChar uint16 + TmLastChar uint16 + TmDefaultChar uint16 + TmBreakChar uint16 + TmItalic byte + TmUnderlined byte + TmStruckOut byte + TmPitchAndFamily byte + TmCharSet byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183574.aspx +type DOCINFO struct { + CbSize int32 + LpszDocName *uint16 + LpszOutput *uint16 + LpszDatatype *uint16 + FwType uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775514.aspx +type NMHDR struct { + HwndFrom HWND + IdFrom uintptr + Code uint32 +} + +type NMUPDOWN struct { + Hdr NMHDR + Pos int32 + Delta int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743.aspx +type LVCOLUMN struct { + Mask uint32 + Fmt int32 + Cx int32 + PszText *uint16 + CchTextMax int32 + ISubItem int32 + IImage int32 + IOrder int32 + CxMin int32 + CxDefault int32 + CxIdeal int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760.aspx +type LVITEM struct { + Mask uint32 + IItem int32 + ISubItem int32 + State uint32 + StateMask uint32 + PszText *uint16 + CchTextMax int32 + IImage int32 + LParam uintptr + IIndent int32 + IGroupId int32 + CColumns uint32 + PuColumns uint32 + PiColFmt *int32 + IGroup int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774754.aspx +type LVHITTESTINFO struct { + Pt POINT + Flags uint32 + IItem int32 + ISubItem int32 + IGroup int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774771.aspx +type NMITEMACTIVATE struct { + Hdr NMHDR + IItem int32 + ISubItem int32 + UNewState uint32 + UOldState uint32 + UChanged uint32 + PtAction POINT + LParam uintptr + UKeyFlags uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773.aspx +type NMLISTVIEW struct { + Hdr NMHDR + IItem int32 + ISubItem int32 + UNewState uint32 + UOldState uint32 + UChanged uint32 + PtAction POINT + LParam uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774780.aspx +type NMLVDISPINFO struct { + Hdr NMHDR + Item LVITEM +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507.aspx +type INITCOMMONCONTROLSEX struct { + size uint32 + ICC uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb760256.aspx +type TOOLINFO struct { + CbSize uint32 + UFlags uint32 + Hwnd HWND + UId uintptr + Rect RECT + Hinst HINSTANCE + LpszText *uint16 + LParam uintptr + LpReserved unsafe.Pointer +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645604.aspx +type TRACKMOUSEEVENT struct { + CbSize uint32 + DwFlags uint32 + HwndTrack HWND + DwHoverTime uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534067.aspx +type GdiplusStartupInput struct { + GdiplusVersion uint32 + DebugEventCallback uintptr + SuppressBackgroundThread BOOL + SuppressExternalCodecs BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534068.aspx +type GdiplusStartupOutput struct { + NotificationHook uintptr + NotificationUnhook uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162768.aspx +type PAINTSTRUCT struct { + Hdc HDC + FErase BOOL + RcPaint RECT + FRestore BOOL + FIncUpdate BOOL + RgbReserved [32]byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363646.aspx +type EVENTLOGRECORD struct { + Length uint32 + Reserved uint32 + RecordNumber uint32 + TimeGenerated uint32 + TimeWritten uint32 + EventID uint32 + EventType uint16 + NumStrings uint16 + EventCategory uint16 + ReservedFlags uint16 + ClosingRecordNumber uint32 + StringOffset uint32 + UserSidLength uint32 + UserSidOffset uint32 + DataLength uint32 + DataOffset uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996.aspx +type SERVICE_STATUS struct { + DwServiceType uint32 + DwCurrentState uint32 + DwControlsAccepted uint32 + DwWin32ExitCode uint32 + DwServiceSpecificExitCode uint32 + DwCheckPoint uint32 + DwWaitHint uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx +type MODULEENTRY32 struct { + Size uint32 + ModuleID uint32 + ProcessID uint32 + GlblcntUsage uint32 + ProccntUsage uint32 + ModBaseAddr *uint8 + ModBaseSize uint32 + HModule HMODULE + SzModule [MAX_MODULE_NAME32 + 1]uint16 + SzExePath [MAX_PATH]uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx +type FILETIME struct { + DwLowDateTime uint32 + DwHighDateTime uint32 +} + +func (t FILETIME) Uint64() uint64 { + return uint64(t.DwHighDateTime)<<32 | uint64(t.DwLowDateTime) +} + +func (t FILETIME) Time() time.Time { + // https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime + ref := time.Date(1601, time.January, 1, 0, 0, 0, 0, time.UTC) + const tick = 100 * time.Nanosecond + // The FILETIME is a uint64 of 100-nanosecond intervals since 1601. + // Unfortunately time.Duration is really an int64 so if we cast our uint64 + // to a time.Duration it becomes negative. Thus we do it in 2 steps, adding + // half the time each step to avoid overflow. + return ref. + Add(time.Duration(t.Uint64()) * (tick / 2)). + Add(time.Duration(t.Uint64()) * (tick / 2)) +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119.aspx +type COORD struct { + X, Y int16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311.aspx +type SMALL_RECT struct { + Left, Top, Right, Bottom int16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093.aspx +type CONSOLE_SCREEN_BUFFER_INFO struct { + DwSize COORD + DwCursorPosition COORD + WAttributes uint16 + SrWindow SMALL_RECT + DwMaximumWindowSize COORD +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773244.aspx +type MARGINS struct { + CxLeftWidth, CxRightWidth, CyTopHeight, CyBottomHeight int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969500.aspx +type DWM_BLURBEHIND struct { + DwFlags uint32 + fEnable BOOL + hRgnBlur HRGN + fTransitionOnMaximized BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969501.aspx +type DWM_PRESENT_PARAMETERS struct { + cbSize uint32 + fQueue BOOL + cRefreshStart DWM_FRAME_COUNT + cBuffer uint32 + fUseSourceRate BOOL + rateSource UNSIGNED_RATIO + cRefreshesPerFrame uint32 + eSampling DWM_SOURCE_FRAME_SAMPLING +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969502.aspx +type DWM_THUMBNAIL_PROPERTIES struct { + dwFlags uint32 + rcDestination RECT + rcSource RECT + opacity byte + fVisible BOOL + fSourceClientAreaOnly BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969503.aspx +type DWM_TIMING_INFO struct { + cbSize uint32 + rateRefresh UNSIGNED_RATIO + qpcRefreshPeriod QPC_TIME + rateCompose UNSIGNED_RATIO + qpcVBlank QPC_TIME + cRefresh DWM_FRAME_COUNT + cDXRefresh uint32 + qpcCompose QPC_TIME + cFrame DWM_FRAME_COUNT + cDXPresent uint32 + cRefreshFrame DWM_FRAME_COUNT + cFrameSubmitted DWM_FRAME_COUNT + cDXPresentSubmitted uint32 + cFrameConfirmed DWM_FRAME_COUNT + cDXPresentConfirmed uint32 + cRefreshConfirmed DWM_FRAME_COUNT + cDXRefreshConfirmed uint32 + cFramesLate DWM_FRAME_COUNT + cFramesOutstanding uint32 + cFrameDisplayed DWM_FRAME_COUNT + qpcFrameDisplayed QPC_TIME + cRefreshFrameDisplayed DWM_FRAME_COUNT + cFrameComplete DWM_FRAME_COUNT + qpcFrameComplete QPC_TIME + cFramePending DWM_FRAME_COUNT + qpcFramePending QPC_TIME + cFramesDisplayed DWM_FRAME_COUNT + cFramesComplete DWM_FRAME_COUNT + cFramesPending DWM_FRAME_COUNT + cFramesAvailable DWM_FRAME_COUNT + cFramesDropped DWM_FRAME_COUNT + cFramesMissed DWM_FRAME_COUNT + cRefreshNextDisplayed DWM_FRAME_COUNT + cRefreshNextPresented DWM_FRAME_COUNT + cRefreshesDisplayed DWM_FRAME_COUNT + cRefreshesPresented DWM_FRAME_COUNT + cRefreshStarted DWM_FRAME_COUNT + cPixelsReceived uint64 + cPixelsDrawn uint64 + cBuffersEmpty DWM_FRAME_COUNT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd389402.aspx +type MilMatrix3x2D struct { + S_11, S_12, S_21, S_22 float64 + DX, DY float64 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969505.aspx +type UNSIGNED_RATIO struct { + uiNumerator uint32 + uiDenominator uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632603.aspx +type CREATESTRUCT struct { + CreateParams uintptr + Instance HINSTANCE + Menu HMENU + Parent HWND + Cy, Cx int32 + Y, X int32 + Style int32 + Name *uint16 + Class *uint16 + dwExStyle uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145065.aspx +type MONITORINFO struct { + CbSize uint32 + RcMonitor RECT + RcWork RECT + DwFlags uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066.aspx +type MONITORINFOEX struct { + MONITORINFO + SzDevice [CCHDEVICENAME]uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826.aspx +type PIXELFORMATDESCRIPTOR struct { + Size uint16 + Version uint16 + DwFlags uint32 + IPixelType byte + ColorBits byte + RedBits, RedShift byte + GreenBits, GreenShift byte + BlueBits, BlueShift byte + AlphaBits, AlphaShift byte + AccumBits byte + AccumRedBits byte + AccumGreenBits byte + AccumBlueBits byte + AccumAlphaBits byte + DepthBits, StencilBits byte + AuxBuffers byte + ILayerType byte + Reserved byte + DwLayerMask uint32 + DwVisibleMask uint32 + DwDamageMask uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx +type SYSTEMTIME struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +func (t SYSTEMTIME) Time() time.Time { + return time.Date( + int(t.Year), + time.Month(t.Month), + int(t.Day), + int(t.Hour), + int(t.Minute), + int(t.Second), + int(t.Milliseconds)*int(time.Millisecond/time.Nanosecond), + time.UTC, + ) +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx +type KBDLLHOOKSTRUCT struct { + VkCode DWORD + ScanCode DWORD + Flags DWORD + Time DWORD + DwExtraInfo ULONG_PTR +} + +type HOOKPROC func(int, WPARAM, LPARAM) LRESULT + +type WINDOWPLACEMENT struct { + Length uint32 + Flags uint32 + ShowCmd uint32 + PtMinPosition POINT + PtMaxPosition POINT + RcNormalPosition RECT +} + +type MINMAXINFO struct { + PtReserved POINT + PtMaxSize POINT + PtMaxPosition POINT + PtMinTrackSize POINT + PtMaxTrackSize POINT +} + +type RAWINPUTHEADER struct { + Type uint32 + Size uint32 + Device HANDLE + WParam WPARAM +} + +type RAWINPUT struct { + Header RAWINPUTHEADER + // NOTE that there is no support for C unions in Go, this would actually be + // a union of RAWMOUSE, RAWKEYBOARD and RAWHID. Since RAWMOUSE is the + // largest of those three, use it here and cast unsafely to get the other + // types. + mouse RAWMOUSE +} + +// GetMouse returns the raw input as a RAWMOUSE. Make sure to check the Header's +// Type flag so this is valid. +func (i *RAWINPUT) GetMouse() RAWMOUSE { + return i.mouse +} + +// GetKeyboard returns the raw input as a RAWKEYBOARD. Make sure to check the +// Header's Type flag so this is valid. +func (i *RAWINPUT) GetKeyboard() RAWKEYBOARD { + return *((*RAWKEYBOARD)(unsafe.Pointer(&i.mouse))) +} + +// GetHid returns the raw input as a RAWHID. Make sure to check the Header's +// Type flag so this is valid. +func (i *RAWINPUT) GetHid() RAWHID { + return *((*RAWHID)(unsafe.Pointer(&i.mouse))) +} + +type RAWKEYBOARD struct { + MakeCode uint16 + Flags uint16 + Reserved uint16 + VKey uint16 + Message uint32 + ExtraInformation uint32 +} + +type RAWHID struct { + SizeHid uint32 + Count uint32 + RawData [1]byte +} + +type RAWMOUSE struct { + Flags uint16 + Buttons uint32 + RawButtons uint32 + LastX int32 + LastY int32 + ExtraInformation uint32 +} + +func (m *RAWMOUSE) ButtonFlags() uint16 { + return uint16(m.Buttons & 0xFFFF) +} + +func (m *RAWMOUSE) ButtonData() uint16 { + return uint16((m.Buttons & 0xFFFF0000) >> 16) +} + +type RAWINPUTDEVICE struct { + UsagePage uint16 + Usage uint16 + Flags uint32 + Target HWND +} + +// INPUT is used in SendInput. To create a concrete INPUT type, use the helper +// functions MouseInput, KeyboardInput and HardwareInput. These are necessary +// because the C API uses a union here, which Go does not provide. +type INPUT struct { + Type uint32 + // use MOUSEINPUT for the union because it is the largest of all allowed + // structures + mouse MOUSEINPUT +} + +type MOUSEINPUT struct { + Dx int32 + Dy int32 + MouseData uint32 + Flags uint32 + Time uint32 + ExtraInfo uintptr +} + +type KEYBDINPUT struct { + Vk uint16 + Scan uint16 + Flags uint32 + Time uint32 + ExtraInfo uintptr +} + +type HARDWAREINPUT struct { + Msg uint32 + ParamL uint16 + ParamH uint16 +} + +func MouseInput(input MOUSEINPUT) INPUT { + return INPUT{ + Type: INPUT_MOUSE, + mouse: input, + } +} + +func KeyboardInput(input KEYBDINPUT) INPUT { + return INPUT{ + Type: INPUT_KEYBOARD, + mouse: *((*MOUSEINPUT)(unsafe.Pointer(&input))), + } +} + +func HardwareInput(input HARDWAREINPUT) INPUT { + return INPUT{ + Type: INPUT_HARDWARE, + mouse: *((*MOUSEINPUT)(unsafe.Pointer(&input))), + } +} + +type VS_FIXEDFILEINFO struct { + Signature uint32 + StrucVersion uint32 + FileVersionMS uint32 + FileVersionLS uint32 + ProductVersionMS uint32 + ProductVersionLS uint32 + FileFlagsMask uint32 + FileFlags uint32 + FileOS uint32 + FileType uint32 + FileSubtype uint32 + FileDateMS uint32 + FileDateLS uint32 +} + +// FileVersion concatenates FileVersionMS and FileVersionLS to a uint64 value. +func (fi VS_FIXEDFILEINFO) FileVersion() uint64 { + return uint64(fi.FileVersionMS)<<32 | uint64(fi.FileVersionLS) +} + +// FileDate concatenates FileDateMS and FileDateLS to a uint64 value. +func (fi VS_FIXEDFILEINFO) FileDate() uint64 { + return uint64(fi.FileDateMS)<<32 | uint64(fi.FileDateLS) +} + +type ACCEL struct { + // Virt is a bit mask which may contain: + // FALT, FCONTROL, FSHIFT: keys to be held for the accelerator + // FVIRTKEY: means that Key is a virtual key code, if not set, Key is + // interpreted as a character code + Virt byte + // Key can either be a virtual key code VK_... or a character + Key uint16 + // Cmd is the value passed to WM_COMMAND or WM_SYSCOMMAND when the + // accelerator triggers + Cmd uint16 +} + +type PHYSICAL_MONITOR struct { + Monitor HANDLE + Description [128]uint16 +} + +type MENUITEMINFO struct { + Size uint32 + Mask uint32 + Type uint32 + State uint32 + ID uint32 + SubMenu HMENU + BmpChecked HBITMAP + BmpUnChecked HBITMAP + ItemData uintptr + TypeData uintptr // UTF-16 string + CCH uint32 + BmpItem HBITMAP +} + +type TPMPARAMS struct { + Size uint32 + Exclude RECT +} + +type MENUINFO struct { + size uint32 + Mask uint32 + Style uint32 + YMax uint32 + Back HBRUSH + ContextHelpID uint32 + MenuData uintptr +} + +type MENUBARINFO struct { + size uint32 + Bar RECT + Menu HMENU + Window HWND + BarFocused int32 // bool + Focused int32 // bool +} + +type ACTCTX struct { + size uint32 + Flags uint32 + Source *uint16 // UTF-16 string + ProcessorArchitecture uint16 + LangID uint16 + AssemblyDirectory *uint16 // UTF-16 string + ResourceName *uint16 // UTF-16 string + ApplicationName *uint16 // UTF-16 string + Module HMODULE +} + +type DRAWITEMSTRUCT struct { + CtlType uint32 + CtlID uint32 + ItemID uint32 + ItemAction uint32 + ItemState uint32 + HwndItem HWND + HDC HDC + RcItem RECT + ItemData uintptr +} + +type BLENDFUNC struct { + BlendOp byte + BlendFlags byte + SourceConstantAlpha byte + AlphaFormat byte +} + +type NETRESOURCE struct { + Scope uint32 + Type uint32 + DisplayType uint32 + Usage uint32 + LocalName string + RemoteName string + Comment string + Provider string +} + +func (n *NETRESOURCE) toInternal() *netresource { + internal := &netresource{ + Scope: n.Scope, + Type: n.Type, + DisplayType: n.DisplayType, + Usage: n.Usage, + } + if n.LocalName != "" { + internal.LocalName = syscall.StringToUTF16Ptr(n.LocalName) + } + if n.RemoteName != "" { + internal.RemoteName = syscall.StringToUTF16Ptr(n.RemoteName) + } + if n.Comment != "" { + internal.Comment = syscall.StringToUTF16Ptr(n.Comment) + } + if n.Provider != "" { + internal.Provider = syscall.StringToUTF16Ptr(n.Provider) + } + return internal +} + +type netresource struct { + Scope uint32 + Type uint32 + DisplayType uint32 + Usage uint32 + LocalName *uint16 + RemoteName *uint16 + Comment *uint16 + Provider *uint16 +} + +type NMLVODSTATECHANGE struct { + Hdr NMHDR + From int32 + To int32 + NewState uint32 + OldState uint32 +} + +type SECURITY_ATTRIBUTES struct { + Length uint32 + SecurityDescriptor unsafe.Pointer + InheritHandle uint32 // bool value +} + +type OVERLAPPED struct { + Internal uintptr + InternalHigh uintptr + Pointer uintptr + Event HANDLE +} + +type STORAGE_DEVICE_DESCRIPTOR struct { + Version uint32 + Size uint32 + DeviceType byte + DeviceTypeModifier byte + RemovableMedia byte // bool value + CommandQueueing byte // bool value + VendorIdOffset uint32 + ProductIdOffset uint32 + ProductRevisionOffset uint32 + SerialNumberOffset uint32 + BusType uint32 // STORAGE_BUS_TYPE + RawPropertiesLength uint32 + RawDeviceProperties [1]byte +} + +type STORAGE_PROPERTY_QUERY struct { + PropertyId uint32 + QueryType uint32 + AdditionalParameters [1]byte +} + +// https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_win32_find_stream_data +type WIN32_FIND_STREAM_DATA struct { + Size int64 + Name [MAX_PATH + 36]uint16 +} + +type MSGBOXPARAMS struct { + Size uint32 + Owner HWND + Instance HINSTANCE + Text *uint16 + Caption *uint16 + Style uint32 + Icon *uint16 + ContextHelpId *uint32 + MsgBoxCallback uintptr + LanguageId uint32 +} + +type POWERBROADCAST_SETTING struct { + PowerSetting GUID + DataLength uint32 + Data [1]byte +} + +// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw +type RTL_OSVERSIONINFOEXW struct { + OSVersionInfoSize uint32 + MajorVersion uint32 + MinorVersion uint32 + BuildNumber uint32 + PlatformId uint32 + CSDVersion [128]uint16 + ServicePackMajor uint16 + ServicePackMinor uint16 + SuiteMask uint16 + ProductType byte + Reserved byte +} + +// https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-system_info +type SYSTEM_INFO struct { + ProcessorArchitecture uint16 + Reserved uint16 + PageSize uint32 + MinimumApplicationAddress LPCVOID + MaximumApplicationAddress LPCVOID + ActiveProcessorMask *uint32 + NumberOfProcessors uint32 + ProcessorType uint32 + AllocationGranularity uint32 + ProcessorLevel uint16 + ProcessorRevision uint16 +} + +type SP_DEVINFO_DATA struct { + Size uint32 + ClassGuid GUID + DevInst uint32 + Reserved uintptr +} + +type WINDOWPOS struct { + Hwnd HWND + HwndInsertAfter HWND + X int32 + Y int32 + Cx int32 + Cy int32 + Flags uint32 +} + +type WINDOWINFO struct { + Cbsize uint32 + RcWindow RECT + RcClient RECT + DwStyle uint32 + DwExStyle uint32 + DwWindowStatus uint32 + CxWindowBorders uint32 + CyWindowBorders uint32 + AtomWindowType uint16 + WCreatorVersion uint16 +} diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 80b4d7e9..c8a62502 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -360,10 +360,10 @@ func (a *App) Run() error { } // set the application menu - a.impl.setApplicationMenu(a.ApplicationMenu) - - // set the application Icon - a.impl.setIcon(a.options.Icon) + if runtime.GOOS == "darwin" { + a.impl.setApplicationMenu(a.ApplicationMenu) + a.impl.setIcon(a.options.Icon) + } err := a.impl.run() if err != nil { diff --git a/v3/pkg/application/application_windows.go b/v3/pkg/application/application_windows.go index de791ce5..15641457 100644 --- a/v3/pkg/application/application_windows.go +++ b/v3/pkg/application/application_windows.go @@ -2,9 +2,19 @@ package application +import ( + "github.com/samber/lo" + "github.com/wailsapp/wails/v3/internal/w32" + "syscall" + "unsafe" +) + +var windowClassName = lo.Must(syscall.UTF16PtrFromString("WailsWebviewWindow")) + type windowsApp struct { - //applicationMenu unsafe.Pointer parent *App + + instance w32.HINSTANCE } func (m *windowsApp) dispatchOnMainThread(id uint) { @@ -23,11 +33,9 @@ func (m *windowsApp) getScreens() ([]*Screen, error) { } func (m *windowsApp) hide() { - //C.hide() } func (m *windowsApp) show() { - //C.show() } func (m *windowsApp) on(eventID uint) { @@ -73,6 +81,9 @@ func (m *windowsApp) run() error { for eventID := range m.parent.applicationEventListeners { m.on(eventID) } + + _ = m.runMainLoop() + //C.run() return nil } @@ -81,9 +92,58 @@ func (m *windowsApp) destroy() { //C.destroyApp() } -func newPlatformApp(app *App) *windowsApp { - //C.init() - return &windowsApp{ - parent: app, +func (m *windowsApp) init() { + // Register the window class + + icon := w32.LoadIconWithResourceID(m.instance, w32.IDI_APPLICATION) + + var wc w32.WNDCLASSEX + wc.Size = uint32(unsafe.Sizeof(wc)) + wc.Style = w32.CS_HREDRAW | w32.CS_VREDRAW + wc.WndProc = syscall.NewCallback(m.wndProc) + wc.Instance = m.instance + wc.Background = w32.COLOR_BTNFACE + 1 + wc.Icon = icon + wc.Cursor = w32.LoadCursorWithResourceID(0, w32.IDC_ARROW) + wc.ClassName = windowClassName + wc.MenuName = nil + wc.IconSm = icon + + if ret := w32.RegisterClassEx(&wc); ret == 0 { + panic(syscall.GetLastError()) } } + +func (m *windowsApp) wndProc(hwnd w32.HWND, msg uint32, wParam, lParam uintptr) uintptr { + switch msg { + case w32.WM_SIZE, w32.WM_PAINT: + return 0 + case w32.WM_CLOSE: + w32.PostQuitMessage(0) + return 0 + } + return w32.DefWindowProc(hwnd, msg, wParam, lParam) +} + +func (m *windowsApp) runMainLoop() int { + msg := (*w32.MSG)(unsafe.Pointer(w32.GlobalAlloc(0, uint32(unsafe.Sizeof(w32.MSG{}))))) + defer w32.GlobalFree(w32.HGLOBAL(unsafe.Pointer(m))) + + for w32.GetMessage(msg, 0, 0, 0) != 0 { + w32.TranslateMessage(msg) + w32.DispatchMessage(msg) + } + + return int(msg.WParam) +} + +func newPlatformApp(app *App) *windowsApp { + result := &windowsApp{ + parent: app, + instance: w32.GetModuleHandle(""), + } + + result.init() + + return result +} diff --git a/v3/pkg/application/menu.go b/v3/pkg/application/menu.go index e20f0e3a..5a613903 100644 --- a/v3/pkg/application/menu.go +++ b/v3/pkg/application/menu.go @@ -96,14 +96,3 @@ func (m *Menu) setContextData(data *ContextMenuData) { func (a *App) NewMenu() *Menu { return &Menu{} } - -func defaultApplicationMenu() *Menu { - menu := NewMenu() - menu.AddRole(AppMenu) - menu.AddRole(FileMenu) - menu.AddRole(EditMenu) - menu.AddRole(ViewMenu) - menu.AddRole(WindowMenu) - menu.AddRole(HelpMenu) - return menu -} diff --git a/v3/pkg/application/menu_darwin.go b/v3/pkg/application/menu_darwin.go index b14be232..dc6493ad 100644 --- a/v3/pkg/application/menu_darwin.go +++ b/v3/pkg/application/menu_darwin.go @@ -103,3 +103,14 @@ func (m *macosMenu) processMenu(parent unsafe.Pointer, menu *Menu) { } } + +func defaultApplicationMenu() *Menu { + menu := NewMenu() + menu.AddRole(AppMenu) + menu.AddRole(FileMenu) + menu.AddRole(EditMenu) + menu.AddRole(ViewMenu) + menu.AddRole(WindowMenu) + menu.AddRole(HelpMenu) + return menu +} diff --git a/v3/pkg/application/menu_windows.go b/v3/pkg/application/menu_windows.go index b60c0b35..33cd608c 100644 --- a/v3/pkg/application/menu_windows.go +++ b/v3/pkg/application/menu_windows.go @@ -50,3 +50,13 @@ func (m *windowsMenu) processMenu(parent unsafe.Pointer, menu *Menu) { // //} } + +func defaultApplicationMenu() *Menu { + menu := NewMenu() + menu.AddRole(FileMenu) + menu.AddRole(EditMenu) + menu.AddRole(ViewMenu) + menu.AddRole(WindowMenu) + menu.AddRole(HelpMenu) + return menu +} diff --git a/v3/pkg/application/options_webview_window.go b/v3/pkg/application/options_webview_window.go index 99e40d05..18f0e600 100644 --- a/v3/pkg/application/options_webview_window.go +++ b/v3/pkg/application/options_webview_window.go @@ -35,6 +35,7 @@ type WebviewWindowOptions struct { EnableFraudulentWebsiteWarnings bool Zoom float64 EnableDragAndDrop bool + Windows WindowsWindow } var WebviewWindowDefaults = &WebviewWindowOptions{ diff --git a/v3/pkg/application/options_windows.go b/v3/pkg/application/options_windows.go new file mode 100644 index 00000000..0e118ddb --- /dev/null +++ b/v3/pkg/application/options_windows.go @@ -0,0 +1,5 @@ +package application + +type WindowsWindow struct { + AlwaysOnTop bool +} diff --git a/v3/pkg/application/roles.go b/v3/pkg/application/roles.go index 0aec3bd4..fe48a0d1 100644 --- a/v3/pkg/application/roles.go +++ b/v3/pkg/application/roles.go @@ -42,8 +42,9 @@ const ( ZoomOut Role = iota ToggleFullscreen Role = iota - Minimize Role = iota - Zoom Role = iota + Minimize Role = iota + Zoom Role = iota + FullScreen Role = iota //Front Role = iota //WindowRole Role = iota @@ -132,6 +133,12 @@ func newWindowMenu() *MenuItem { menu := NewMenu() menu.AddRole(Minimize) menu.AddRole(Zoom) + if runtime.GOOS == "darwin" { + menu.AddSeparator() + menu.AddRole(FullScreen) + } else { + menu.AddRole(Close) + } subMenu := newSubMenuItem("Window") subMenu.submenu = menu return subMenu diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index f651a773..6e536ca5 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -3,6 +3,9 @@ package application import ( + "github.com/samber/lo" + "github.com/wailsapp/wails/v3/internal/w32" + "syscall" "unsafe" ) @@ -64,8 +67,43 @@ func (w *windowsWebviewWindow) setBackgroundColour(color *RGBA) { } func (w *windowsWebviewWindow) run() { - //TODO implement me - panic("implement me") + + var exStyle uint + options := w.parent.options + windowsOptions := options.Windows + //if windowsOptions != nil { + exStyle = w32.WS_EX_CONTROLPARENT | w32.WS_EX_APPWINDOW + // if windowsOptions.WindowIsTranslucent { + // exStyle |= w32.WS_EX_NOREDIRECTIONBITMAP + // } + //} + if windowsOptions.AlwaysOnTop { + exStyle |= w32.WS_EX_TOPMOST + } + var hwnd w32.HWND + hwnd = w32.CreateWindowEx( + exStyle, + windowClassName, + lo.Must(syscall.UTF16PtrFromString("My Window Title")), + w32.WS_OVERLAPPEDWINDOW|w32.WS_VISIBLE, + w32.CW_USEDEFAULT, + w32.CW_USEDEFAULT, + options.Width, + options.Height, + 0, + 0, + w32.GetModuleHandle(""), + nil) + + if hwnd == 0 { + panic("Unable to create window") + } + + if !options.Hidden { + w32.ShowWindow(hwnd, w32.SW_SHOW) + w32.UpdateWindow(hwnd) + } + w32.SetForegroundWindow(hwnd) } func (w *windowsWebviewWindow) center() { @@ -242,6 +280,7 @@ func newWindowImpl(parent *WebviewWindow) *windowsWebviewWindow { result := &windowsWebviewWindow{ parent: parent, } + return result }