diff options
Diffstat (limited to 'windows_windows.go')
| -rw-r--r-- | windows_windows.go | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/windows_windows.go b/windows_windows.go new file mode 100644 index 0000000..2378aba --- /dev/null +++ b/windows_windows.go @@ -0,0 +1,382 @@ +// 8 february 2014 +package main + +import ( + "syscall" + "unsafe" +) + +// Window styles. +const ( + WS_BORDER = 0x00800000 + WS_CAPTION = 0x00C00000 + WS_CHILD = 0x40000000 + WS_CHILDWINDOW = 0x40000000 + WS_CLIPCHILDREN = 0x02000000 + WS_CLIPSIBLINGS = 0x04000000 + WS_DISABLED = 0x08000000 + WS_DLGFRAME = 0x00400000 + WS_GROUP = 0x00020000 + WS_HSCROLL = 0x00100000 + WS_ICONIC = 0x20000000 + WS_MAXIMIZE = 0x01000000 + WS_MAXIMIZEBOX = 0x00010000 + WS_MINIMIZE = 0x20000000 + WS_MINIMIZEBOX = 0x00020000 + WS_OVERLAPPED = 0x00000000 + WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) + WS_POPUP = 0x80000000 + WS_POPUPWINDOW = (WS_POPUP | WS_BORDER | WS_SYSMENU) + WS_SIZEBOX = 0x00040000 + WS_SYSMENU = 0x00080000 + WS_TABSTOP = 0x00010000 + WS_THICKFRAME = 0x00040000 + WS_TILED = 0x00000000 + WS_TILEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) + WS_VISIBLE = 0x10000000 + WS_VSCROLL = 0x00200000 +) + +// Extended window styles. +const ( + WS_EX_ACCEPTFILES = 0x00000010 + WS_EX_APPWINDOW = 0x00040000 + WS_EX_CLIENTEDGE = 0x00000200 +// WS_EX_COMPOSITED = 0x02000000 // [Windows 2000:This style is not supported.] + WS_EX_CONTEXTHELP = 0x00000400 + WS_EX_CONTROLPARENT = 0x00010000 + WS_EX_DLGMODALFRAME = 0x00000001 + WS_EX_LAYERED = 0x00080000 + WS_EX_LAYOUTRTL = 0x00400000 + WS_EX_LEFT = 0x00000000 + WS_EX_LEFTSCROLLBAR = 0x00004000 + WS_EX_LTRREADING = 0x00000000 + WS_EX_MDICHILD = 0x00000040 + WS_EX_NOACTIVATE = 0x08000000 + WS_EX_NOINHERITLAYOUT = 0x00100000 + WS_EX_NOPARENTNOTIFY = 0x00000004 + WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE) + WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST) + WS_EX_RIGHT = 0x00001000 + WS_EX_RIGHTSCROLLBAR = 0x00000000 + WS_EX_RTLREADING = 0x00002000 + WS_EX_STATICEDGE = 0x00020000 + WS_EX_TOOLWINDOW = 0x00000080 + WS_EX_TOPMOST = 0x00000008 + WS_EX_TRANSPARENT = 0x00000020 + WS_EX_WINDOWEDGE = 0x00000100 +) + +// bizarrely, this value is given on the page for CreateMDIWindow, but not CreateWindow or CreateWindowEx +// I do it this way because Go won't let me shove the exact value into an int +var ( + _uCW_USEDEFAULT uint = 0x80000000 + CW_USEDEFAULT = int(_uCW_USEDEFAULT) +) + +// GetSysColor values. These can be cast to HBRUSH (after adding 1) for WNDCLASS as well. +const ( + COLOR_3DDKSHADOW = 21 + COLOR_3DFACE = 15 + COLOR_3DHIGHLIGHT = 20 + COLOR_3DHILIGHT = 20 + COLOR_3DLIGHT = 22 + COLOR_3DSHADOW = 16 + COLOR_ACTIVEBORDER = 10 + COLOR_ACTIVECAPTION = 2 + COLOR_APPWORKSPACE = 12 + COLOR_BACKGROUND = 1 + COLOR_BTNFACE = 15 + COLOR_BTNHIGHLIGHT = 20 + COLOR_BTNHILIGHT = 20 + COLOR_BTNSHADOW = 16 + COLOR_BTNTEXT = 18 + COLOR_CAPTIONTEXT = 9 + COLOR_DESKTOP = 1 + COLOR_GRADIENTACTIVECAPTION = 27 + COLOR_GRADIENTINACTIVECAPTION = 28 + COLOR_GRAYTEXT = 17 + COLOR_HIGHLIGHT = 13 + COLOR_HIGHLIGHTTEXT = 14 + COLOR_HOTLIGHT = 26 + COLOR_INACTIVEBORDER = 11 + COLOR_INACTIVECAPTION = 3 + COLOR_INACTIVECAPTIONTEXT = 19 + COLOR_INFOBK = 24 + COLOR_INFOTEXT = 23 + COLOR_MENU = 4 +// COLOR_MENUHILIGHT = 29 // [Windows 2000:This value is not supported.] +// COLOR_MENUBAR = 30 // [Windows 2000:This value is not supported.] + COLOR_MENUTEXT = 7 + COLOR_SCROLLBAR = 0 + COLOR_WINDOW = 5 + COLOR_WINDOWFRAME = 6 + COLOR_WINDOWTEXT = 8 +) + +// SetWindowPos hWndInsertAfter values. +const ( + HWND_BOTTOM = HWND(1) + HWND_TOP = HWND(0) +) + +// SetWindowPos hWndInsertAfter values that Go won't allow as constants. +var ( + _HWND_NOTOPMOST = -2 + HWND_NOTOPMOST = HWND(_HWND_NOTOPMOST) + _HWND_TOPMOST = -1 + HWND_TOPMOST = HWND(_HWND_TOPMOST) +) + +// SetWindowPos uFlags values. +const ( + SWP_DRAWFRAME = 0x0020 + SWP_FRAMECHANGED = 0x0020 + SWP_HIDEWINDOW = 0x0080 + SWP_NOACTIVATE = 0x0010 + SWP_NOCOPYBITS = 0x0100 + SWP_NOMOVE = 0x0002 + SWP_NOOWNERZORDER = 0x0200 + SWP_NOREDRAW = 0x0008 + SWP_NOREPOSITION = 0x0200 + SWP_NOSENDCHANGING = 0x0400 + SWP_NOSIZE = 0x0001 + SWP_NOZORDER = 0x0004 + SWP_SHOWWINDOW = 0x0040 + SWP_ASYNCWINDOWPOS = 0x4000 + SWP_DEFERERASE = 0x2000 +) + +// ShowWindow settings. +const ( + SW_FORCEMINIMIZE = 11 + SW_HIDE = 0 + SW_MAXIMIZE = 3 + SW_MINIMIZE = 6 + SW_RESTORE = 9 + SW_SHOW = 5 + SW_SHOWDEFAULT = 10 + SW_SHOWMAXIMIZED = 3 + SW_SHOWMINIMIZED = 2 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_SHOWNOACTIVATE = 4 + SW_SHOWNORMAL = 1 +) + +var ( + createWindowEx = user32.NewProc("CreateWindowExW") + destroyWindow = user32.NewProc("DestroyWindow") + getClientRect = user32.NewProc("GetClientRect") + enumChildWindows = user32.NewProc("EnumChildWindows") + setWindowPos = user32.NewProc("SetWindowPos") + showWindow = user32.NewProc("ShowWindow") +) + +// TODO use lpParam +func CreateWindowEx(dwExStyle uint32, lpClassName string, lpWindowName string, dwStyle uint32, x int, y int, nWidth int, nHeight int, hwndParent HWND, hMenu HMENU, hInstance HANDLE, lpParam interface{}) (hwnd HWND, err error) { + r1, _, err := createWindowEx.Call( + uintptr(dwExStyle), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpClassName))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpWindowName))), + uintptr(dwStyle), + uintptr(x), + uintptr(y), + uintptr(nWidth), + uintptr(nHeight), + uintptr(hwndParent), + uintptr(hMenu), + uintptr(hInstance), + uintptr(0)) + if r1 == 0 { // failure + return NULL, err + } + return HWND(r1), nil +} + +func DestroyWindow(hWnd HWND) (err error) { + r1, _, err := destroyWindow.Call(uintptr(hWnd)) + if r1 == 0 { // failure + return err + } + return nil +} + +type WNDENUMPROC func(hwnd HWND, lParam LPARAM) (cont bool) +type _WNDENUMPROC func(hwnd HWND, lParam LPARAM) int + +func enumChildProc(p WNDENUMPROC) _WNDENUMPROC { + return func(hwnd HWND, lParam LPARAM) int { + if p(hwnd, lParam) { + return TRUE + } + return FALSE + } +} + +// TODO figure out how to handle errors +func EnumChildWindows(hWndParent HWND, lpEnumFunc WNDENUMPROC, lParam LPARAM) (err error) { + enumChildWindows.Call( + uintptr(hWndParent), + syscall.NewCallback(enumChildProc(lpEnumFunc)), + uintptr(lParam)) + return nil +} + +// TODO return the rect itself? +func GetClientRect(hWnd HWND) (lpRect *RECT, err error) { + lpRect = new(RECT) + r1, _, err := getClientRect.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(lpRect))) + if r1 == 0 { // failure + return nil, err + } + return lpRect, nil +} + +func SetWindowPos(hWnd HWND, hWndInsertAfter HWND, X int, Y int, cx int, cy int, uFlags uint32) (err error) { + r1, _, err := setWindowPos.Call( + uintptr(hWnd), + uintptr(hWndInsertAfter), + uintptr(X), + uintptr(Y), + uintptr(cx), + uintptr(cy), + uintptr(uFlags)) + if r1 == 0 { // failure + return err + } + return nil +} + +// TODO figure out how to handle errors +func ShowWindow(hWnd HWND, nCmdShow int) (previouslyVisible bool, err error) { + r1, _, _ := showWindow.Call( + uintptr(hWnd), + uintptr(nCmdShow)) + return r1 != 0, nil +} + +// WM_SETICON and WM_GETICON values. +const ( + ICON_BIG = 1 + ICON_SMALL = 0 + ICON_SMALL2 = 2 // WM_GETICON only? +) + +// Window messages. +const ( + MN_GETHMENU = 0x01E1 + WM_ERASEBKGND = 0x0014 + WM_GETFONT = 0x0031 + WM_GETTEXT = 0x000D + WM_GETTEXTLENGTH = 0x000E + WM_SETFONT = 0x0030 + WM_SETICON = 0x0080 + WM_SETTEXT = 0x000C +) + +// WM_INPUTLANGCHANGEREQUEST values. +const ( + INPUTLANGCHANGE_BACKWARD = 0x0004 + INPUTLANGCHANGE_FORWARD = 0x0002 + INPUTLANGCHANGE_SYSCHARSET = 0x0001 +) + +// WM_NCCALCSIZE return values. +const ( + WVR_ALIGNTOP = 0x0010 + WVR_ALIGNRIGHT = 0x0080 + WVR_ALIGNLEFT = 0x0020 + WVR_ALIGNBOTTOM = 0x0040 + WVR_HREDRAW = 0x0100 + WVR_VREDRAW = 0x0200 + WVR_REDRAW = 0x0300 + WVR_VALIDRECTS = 0x0400 +) + +// WM_SHOWWINDOW reasons (lParam). +const ( + SW_OTHERUNZOOM = 4 + SW_OTHERZOOM = 2 + SW_PARENTCLOSING = 1 + SW_PARENTOPENING = 3 +) + +// WM_SIZE values. +const ( + SIZE_MAXHIDE = 4 + SIZE_MAXIMIZED = 2 + SIZE_MAXSHOW = 3 + SIZE_MINIMIZED = 1 + SIZE_RESTORED = 0 +) + +// WM_SIZING edge values (wParam). +const ( + WMSZ_BOTTOM = 6 + WMSZ_BOTTOMLEFT = 7 + WMSZ_BOTTOMRIGHT = 8 + WMSZ_LEFT = 1 + WMSZ_RIGHT = 2 + WMSZ_TOP = 3 + WMSZ_TOPLEFT = 4 + WMSZ_TOPRIGHT = 5 +) + +// WM_STYLECHANGED and WM_STYLECHANGING values (wParam). +const ( + GWL_EXSTYLE = -20 + GWL_STYLE = -16 +) + +// Window notifications. +const ( + WM_ACTIVATEAPP = 0x001C + WM_CANCELMODE = 0x001F + WM_CHILDACTIVATE = 0x0022 + WM_CLOSE = 0x0010 + WM_COMPACTING = 0x0041 + WM_CREATE = 0x0001 + WM_DESTROY = 0x0002 +// WM_DPICHANGED = 0x02E0 // Windows 8.1 and newer only + WM_ENABLE = 0x000A + WM_ENTERSIZEMOVE = 0x0231 + WM_EXITSIZEMOVE = 0x0232 + WM_GETICON = 0x007F + WM_GETMINMAXINFO = 0x0024 + WM_INPUTLANGCHANGE = 0x0051 + WM_INPUTLANGCHANGEREQUEST = 0x0050 + WM_MOVE = 0x0003 + WM_MOVING = 0x0216 + WM_NCACTIVATE = 0x0086 + WM_NCCALCSIZE = 0x0083 + WM_NCCREATE = 0x0081 + WM_NCDESTROY = 0x0082 + WM_NULL = 0x0000 + WM_QUERYDRAGICON = 0x0037 + WM_QUERYOPEN = 0x0013 + WM_QUIT = 0x0012 + WM_SHOWWINDOW = 0x0018 + WM_SIZE = 0x0005 + WM_SIZING = 0x0214 + WM_STYLECHANGED = 0x007D + WM_STYLECHANGING = 0x007C +// WM_THEMECHANGED = 0x031A // Windows XP and newer only +// WM_USERCHANGED = 0x0054 // Windows XP only: [Note This message is not supported as of Windows Vista.; also listed as not supported by server Windows] + WM_WINDOWPOSCHANGED = 0x0047 + WM_WINDOWPOSCHANGING = 0x0046 +) + +type MINMAXINFO struct { + PtReserved POINT + PtMaxSize POINT + PtMaxPosition POINT + PtMinTrackSize POINT + PtMaxTrackSize POINT +} + +func (l LPARAM) MINMAXINFO() *MINMAXINFO { + return (*MINMAXINFO)(unsafe.Pointer(l)) +} |
