123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858 |
- // SPDX-License-Identifier: Unlicense OR MIT
- //go:build windows
- // +build windows
- package windows
- import (
- "fmt"
- "runtime"
- "time"
- "unicode/utf16"
- "unsafe"
- syscall "golang.org/x/sys/windows"
- )
- type CompositionForm struct {
- dwStyle uint32
- ptCurrentPos Point
- rcArea Rect
- }
- type CandidateForm struct {
- dwIndex uint32
- dwStyle uint32
- ptCurrentPos Point
- rcArea Rect
- }
- type Rect struct {
- Left, Top, Right, Bottom int32
- }
- type WndClassEx struct {
- CbSize uint32
- Style uint32
- LpfnWndProc uintptr
- CnClsExtra int32
- CbWndExtra int32
- HInstance syscall.Handle
- HIcon syscall.Handle
- HCursor syscall.Handle
- HbrBackground syscall.Handle
- LpszMenuName *uint16
- LpszClassName *uint16
- HIconSm syscall.Handle
- }
- type Margins struct {
- CxLeftWidth int32
- CxRightWidth int32
- CyTopHeight int32
- CyBottomHeight int32
- }
- type Msg struct {
- Hwnd syscall.Handle
- Message uint32
- WParam uintptr
- LParam uintptr
- Time uint32
- Pt Point
- LPrivate uint32
- }
- type Point struct {
- X, Y int32
- }
- type MinMaxInfo struct {
- PtReserved Point
- PtMaxSize Point
- PtMaxPosition Point
- PtMinTrackSize Point
- PtMaxTrackSize Point
- }
- type NCCalcSizeParams struct {
- Rgrc [3]Rect
- LpPos *WindowPos
- }
- type WindowPos struct {
- HWND syscall.Handle
- HWNDInsertAfter syscall.Handle
- x int32
- y int32
- cx int32
- cy int32
- flags uint32
- }
- type WindowPlacement struct {
- length uint32
- flags uint32
- showCmd uint32
- ptMinPosition Point
- ptMaxPosition Point
- rcNormalPosition Rect
- rcDevice Rect
- }
- type MonitorInfo struct {
- cbSize uint32
- Monitor Rect
- WorkArea Rect
- Flags uint32
- }
- const (
- TRUE = 1
- CPS_CANCEL = 0x0004
- CS_HREDRAW = 0x0002
- CS_INSERTCHAR = 0x2000
- CS_NOMOVECARET = 0x4000
- CS_VREDRAW = 0x0001
- CS_OWNDC = 0x0020
- CW_USEDEFAULT = -2147483648
- GWL_STYLE = ^(uintptr(16) - 1) // -16
- GCS_COMPSTR = 0x0008
- GCS_COMPREADSTR = 0x0001
- GCS_CURSORPOS = 0x0080
- GCS_DELTASTART = 0x0100
- GCS_RESULTREADSTR = 0x0200
- GCS_RESULTSTR = 0x0800
- CFS_POINT = 0x0002
- CFS_CANDIDATEPOS = 0x0040
- HWND_TOPMOST = ^(uint32(1) - 1) // -1
- HTCAPTION = 2
- HTCLIENT = 1
- HTLEFT = 10
- HTRIGHT = 11
- HTTOP = 12
- HTTOPLEFT = 13
- HTTOPRIGHT = 14
- HTBOTTOM = 15
- HTBOTTOMLEFT = 16
- HTBOTTOMRIGHT = 17
- IDC_APPSTARTING = 32650 // Standard arrow and small hourglass
- IDC_ARROW = 32512 // Standard arrow
- IDC_CROSS = 32515 // Crosshair
- IDC_HAND = 32649 // Hand
- IDC_HELP = 32651 // Arrow and question mark
- IDC_IBEAM = 32513 // I-beam
- IDC_NO = 32648 // Slashed circle
- IDC_SIZEALL = 32646 // Four-pointed arrow pointing north, south, east, and west
- IDC_SIZENESW = 32643 // Double-pointed arrow pointing northeast and southwest
- IDC_SIZENS = 32645 // Double-pointed arrow pointing north and south
- IDC_SIZENWSE = 32642 // Double-pointed arrow pointing northwest and southeast
- IDC_SIZEWE = 32644 // Double-pointed arrow pointing west and east
- IDC_UPARROW = 32516 // Vertical arrow
- IDC_WAIT = 32514 // Hour
- INFINITE = 0xFFFFFFFF
- LOGPIXELSX = 88
- MDT_EFFECTIVE_DPI = 0
- MONITOR_DEFAULTTOPRIMARY = 1
- NI_COMPOSITIONSTR = 0x0015
- SIZE_MAXIMIZED = 2
- SIZE_MINIMIZED = 1
- SIZE_RESTORED = 0
- SCS_SETSTR = GCS_COMPREADSTR | GCS_COMPSTR
- SM_CXSIZEFRAME = 32
- SM_CYSIZEFRAME = 33
- SW_SHOWDEFAULT = 10
- SW_SHOWMINIMIZED = 2
- SW_SHOWMAXIMIZED = 3
- SW_SHOWNORMAL = 1
- SW_SHOW = 5
- SWP_FRAMECHANGED = 0x0020
- SWP_NOMOVE = 0x0002
- SWP_NOOWNERZORDER = 0x0200
- SWP_NOSIZE = 0x0001
- SWP_NOZORDER = 0x0004
- SWP_SHOWWINDOW = 0x0040
- USER_TIMER_MINIMUM = 0x0000000A
- VK_CONTROL = 0x11
- VK_LWIN = 0x5B
- VK_MENU = 0x12
- VK_RWIN = 0x5C
- VK_SHIFT = 0x10
- VK_BACK = 0x08
- VK_DELETE = 0x2e
- VK_DOWN = 0x28
- VK_END = 0x23
- VK_ESCAPE = 0x1b
- VK_HOME = 0x24
- VK_LEFT = 0x25
- VK_NEXT = 0x22
- VK_PRIOR = 0x21
- VK_RIGHT = 0x27
- VK_RETURN = 0x0d
- VK_SPACE = 0x20
- VK_TAB = 0x09
- VK_UP = 0x26
- 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_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_102 = 0xe2
- UNICODE_NOCHAR = 65535
- WM_CANCELMODE = 0x001F
- WM_CHAR = 0x0102
- WM_CLOSE = 0x0010
- WM_CREATE = 0x0001
- WM_DPICHANGED = 0x02E0
- WM_DESTROY = 0x0002
- WM_ERASEBKGND = 0x0014
- WM_GETMINMAXINFO = 0x0024
- WM_IME_COMPOSITION = 0x010F
- WM_IME_ENDCOMPOSITION = 0x010E
- WM_IME_STARTCOMPOSITION = 0x010D
- WM_KEYDOWN = 0x0100
- WM_KEYUP = 0x0101
- WM_KILLFOCUS = 0x0008
- WM_LBUTTONDOWN = 0x0201
- WM_LBUTTONUP = 0x0202
- WM_MBUTTONDOWN = 0x0207
- WM_MBUTTONUP = 0x0208
- WM_MOUSEMOVE = 0x0200
- WM_MOUSEWHEEL = 0x020A
- WM_MOUSEHWHEEL = 0x020E
- WM_NCACTIVATE = 0x0086
- WM_NCHITTEST = 0x0084
- WM_NCCALCSIZE = 0x0083
- WM_PAINT = 0x000F
- WM_QUIT = 0x0012
- WM_SETCURSOR = 0x0020
- WM_SETFOCUS = 0x0007
- WM_SHOWWINDOW = 0x0018
- WM_SIZE = 0x0005
- WM_STYLECHANGED = 0x007D
- WM_SYSKEYDOWN = 0x0104
- WM_SYSKEYUP = 0x0105
- WM_RBUTTONDOWN = 0x0204
- WM_RBUTTONUP = 0x0205
- WM_TIMER = 0x0113
- WM_UNICHAR = 0x0109
- WM_USER = 0x0400
- WM_WINDOWPOSCHANGED = 0x0047
- WS_CLIPCHILDREN = 0x02000000
- WS_CLIPSIBLINGS = 0x04000000
- WS_MAXIMIZE = 0x01000000
- WS_ICONIC = 0x20000000
- WS_VISIBLE = 0x10000000
- WS_OVERLAPPED = 0x00000000
- WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |
- WS_MINIMIZEBOX | WS_MAXIMIZEBOX
- WS_CAPTION = 0x00C00000
- WS_SYSMENU = 0x00080000
- WS_THICKFRAME = 0x00040000
- WS_MINIMIZEBOX = 0x00020000
- WS_MAXIMIZEBOX = 0x00010000
- WS_EX_APPWINDOW = 0x00040000
- WS_EX_WINDOWEDGE = 0x00000100
- QS_ALLINPUT = 0x04FF
- MWMO_WAITALL = 0x0001
- MWMO_INPUTAVAILABLE = 0x0004
- WAIT_OBJECT_0 = 0
- PM_REMOVE = 0x0001
- PM_NOREMOVE = 0x0000
- GHND = 0x0042
- CF_UNICODETEXT = 13
- IMAGE_BITMAP = 0
- IMAGE_ICON = 1
- IMAGE_CURSOR = 2
- LR_CREATEDIBSECTION = 0x00002000
- LR_DEFAULTCOLOR = 0x00000000
- LR_DEFAULTSIZE = 0x00000040
- LR_LOADFROMFILE = 0x00000010
- LR_LOADMAP3DCOLORS = 0x00001000
- LR_LOADTRANSPARENT = 0x00000020
- LR_MONOCHROME = 0x00000001
- LR_SHARED = 0x00008000
- LR_VGACOLOR = 0x00000080
- )
- var (
- kernel32 = syscall.NewLazySystemDLL("kernel32.dll")
- _GetModuleHandleW = kernel32.NewProc("GetModuleHandleW")
- _GlobalAlloc = kernel32.NewProc("GlobalAlloc")
- _GlobalFree = kernel32.NewProc("GlobalFree")
- _GlobalLock = kernel32.NewProc("GlobalLock")
- _GlobalUnlock = kernel32.NewProc("GlobalUnlock")
- user32 = syscall.NewLazySystemDLL("user32.dll")
- _AdjustWindowRectEx = user32.NewProc("AdjustWindowRectEx")
- _CallMsgFilter = user32.NewProc("CallMsgFilterW")
- _CloseClipboard = user32.NewProc("CloseClipboard")
- _CreateWindowEx = user32.NewProc("CreateWindowExW")
- _DefWindowProc = user32.NewProc("DefWindowProcW")
- _DestroyWindow = user32.NewProc("DestroyWindow")
- _DispatchMessage = user32.NewProc("DispatchMessageW")
- _EmptyClipboard = user32.NewProc("EmptyClipboard")
- _GetWindowRect = user32.NewProc("GetWindowRect")
- _GetClientRect = user32.NewProc("GetClientRect")
- _GetClipboardData = user32.NewProc("GetClipboardData")
- _GetDC = user32.NewProc("GetDC")
- _GetDpiForWindow = user32.NewProc("GetDpiForWindow")
- _GetKeyState = user32.NewProc("GetKeyState")
- _GetMessage = user32.NewProc("GetMessageW")
- _GetMessageTime = user32.NewProc("GetMessageTime")
- _GetMonitorInfo = user32.NewProc("GetMonitorInfoW")
- _GetSystemMetrics = user32.NewProc("GetSystemMetrics")
- _GetWindowLong = user32.NewProc("GetWindowLongPtrW")
- _GetWindowLong32 = user32.NewProc("GetWindowLongW")
- _GetWindowPlacement = user32.NewProc("GetWindowPlacement")
- _KillTimer = user32.NewProc("KillTimer")
- _LoadCursor = user32.NewProc("LoadCursorW")
- _LoadImage = user32.NewProc("LoadImageW")
- _MonitorFromPoint = user32.NewProc("MonitorFromPoint")
- _MonitorFromWindow = user32.NewProc("MonitorFromWindow")
- _MoveWindow = user32.NewProc("MoveWindow")
- _MsgWaitForMultipleObjectsEx = user32.NewProc("MsgWaitForMultipleObjectsEx")
- _OpenClipboard = user32.NewProc("OpenClipboard")
- _PeekMessage = user32.NewProc("PeekMessageW")
- _PostMessage = user32.NewProc("PostMessageW")
- _PostQuitMessage = user32.NewProc("PostQuitMessage")
- _ReleaseCapture = user32.NewProc("ReleaseCapture")
- _RegisterClassExW = user32.NewProc("RegisterClassExW")
- _ReleaseDC = user32.NewProc("ReleaseDC")
- _ScreenToClient = user32.NewProc("ScreenToClient")
- _ShowWindow = user32.NewProc("ShowWindow")
- _SetCapture = user32.NewProc("SetCapture")
- _SetCursor = user32.NewProc("SetCursor")
- _SetClipboardData = user32.NewProc("SetClipboardData")
- _SetForegroundWindow = user32.NewProc("SetForegroundWindow")
- _SetFocus = user32.NewProc("SetFocus")
- _SetProcessDPIAware = user32.NewProc("SetProcessDPIAware")
- _SetTimer = user32.NewProc("SetTimer")
- _SetWindowLong = user32.NewProc("SetWindowLongPtrW")
- _SetWindowLong32 = user32.NewProc("SetWindowLongW")
- _SetWindowPlacement = user32.NewProc("SetWindowPlacement")
- _SetWindowPos = user32.NewProc("SetWindowPos")
- _SetWindowText = user32.NewProc("SetWindowTextW")
- _TranslateMessage = user32.NewProc("TranslateMessage")
- _UnregisterClass = user32.NewProc("UnregisterClassW")
- _UpdateWindow = user32.NewProc("UpdateWindow")
- shcore = syscall.NewLazySystemDLL("shcore")
- _GetDpiForMonitor = shcore.NewProc("GetDpiForMonitor")
- gdi32 = syscall.NewLazySystemDLL("gdi32")
- _GetDeviceCaps = gdi32.NewProc("GetDeviceCaps")
- imm32 = syscall.NewLazySystemDLL("imm32")
- _ImmGetContext = imm32.NewProc("ImmGetContext")
- _ImmGetCompositionString = imm32.NewProc("ImmGetCompositionStringW")
- _ImmNotifyIME = imm32.NewProc("ImmNotifyIME")
- _ImmReleaseContext = imm32.NewProc("ImmReleaseContext")
- _ImmSetCandidateWindow = imm32.NewProc("ImmSetCandidateWindow")
- _ImmSetCompositionWindow = imm32.NewProc("ImmSetCompositionWindow")
- dwmapi = syscall.NewLazySystemDLL("dwmapi")
- _DwmExtendFrameIntoClientArea = dwmapi.NewProc("DwmExtendFrameIntoClientArea")
- )
- func AdjustWindowRectEx(r *Rect, dwStyle uint32, bMenu int, dwExStyle uint32) {
- _AdjustWindowRectEx.Call(uintptr(unsafe.Pointer(r)), uintptr(dwStyle), uintptr(bMenu), uintptr(dwExStyle))
- }
- func CallMsgFilter(m *Msg, nCode uintptr) bool {
- r, _, _ := _CallMsgFilter.Call(uintptr(unsafe.Pointer(m)), nCode)
- return r != 0
- }
- func CloseClipboard() error {
- r, _, err := _CloseClipboard.Call()
- if r == 0 {
- return fmt.Errorf("CloseClipboard: %v", err)
- }
- return nil
- }
- func CreateWindowEx(dwExStyle uint32, lpClassName uint16, lpWindowName string, dwStyle uint32, x, y, w, h int32, hWndParent, hMenu, hInstance syscall.Handle, lpParam uintptr) (syscall.Handle, error) {
- wname := syscall.StringToUTF16Ptr(lpWindowName)
- hwnd, _, err := _CreateWindowEx.Call(
- uintptr(dwExStyle),
- uintptr(lpClassName),
- uintptr(unsafe.Pointer(wname)),
- uintptr(dwStyle),
- uintptr(x), uintptr(y),
- uintptr(w), uintptr(h),
- uintptr(hWndParent),
- uintptr(hMenu),
- uintptr(hInstance),
- uintptr(lpParam))
- if hwnd == 0 {
- return 0, fmt.Errorf("CreateWindowEx failed: %v", err)
- }
- return syscall.Handle(hwnd), nil
- }
- func DefWindowProc(hwnd syscall.Handle, msg uint32, wparam, lparam uintptr) uintptr {
- r, _, _ := _DefWindowProc.Call(uintptr(hwnd), uintptr(msg), wparam, lparam)
- return r
- }
- func DestroyWindow(hwnd syscall.Handle) {
- _DestroyWindow.Call(uintptr(hwnd))
- }
- func DispatchMessage(m *Msg) {
- _DispatchMessage.Call(uintptr(unsafe.Pointer(m)))
- }
- func DwmExtendFrameIntoClientArea(hwnd syscall.Handle, margins Margins) error {
- r, _, _ := _DwmExtendFrameIntoClientArea.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&margins)))
- if r != 0 {
- return fmt.Errorf("DwmExtendFrameIntoClientArea: %#x", r)
- }
- return nil
- }
- func EmptyClipboard() error {
- r, _, err := _EmptyClipboard.Call()
- if r == 0 {
- return fmt.Errorf("EmptyClipboard: %v", err)
- }
- return nil
- }
- func GetWindowRect(hwnd syscall.Handle) Rect {
- var r Rect
- _GetWindowRect.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&r)))
- return r
- }
- func GetClientRect(hwnd syscall.Handle) Rect {
- var r Rect
- _GetClientRect.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&r)))
- return r
- }
- func GetClipboardData(format uint32) (syscall.Handle, error) {
- r, _, err := _GetClipboardData.Call(uintptr(format))
- if r == 0 {
- return 0, fmt.Errorf("GetClipboardData: %v", err)
- }
- return syscall.Handle(r), nil
- }
- func GetDC(hwnd syscall.Handle) (syscall.Handle, error) {
- hdc, _, err := _GetDC.Call(uintptr(hwnd))
- if hdc == 0 {
- return 0, fmt.Errorf("GetDC failed: %v", err)
- }
- return syscall.Handle(hdc), nil
- }
- func GetModuleHandle() (syscall.Handle, error) {
- h, _, err := _GetModuleHandleW.Call(uintptr(0))
- if h == 0 {
- return 0, fmt.Errorf("GetModuleHandleW failed: %v", err)
- }
- return syscall.Handle(h), nil
- }
- func getDeviceCaps(hdc syscall.Handle, index int32) int {
- c, _, _ := _GetDeviceCaps.Call(uintptr(hdc), uintptr(index))
- return int(c)
- }
- func getDpiForMonitor(hmonitor syscall.Handle, dpiType uint32) int {
- var dpiX, dpiY uintptr
- _GetDpiForMonitor.Call(uintptr(hmonitor), uintptr(dpiType), uintptr(unsafe.Pointer(&dpiX)), uintptr(unsafe.Pointer(&dpiY)))
- return int(dpiX)
- }
- // GetSystemDPI returns the effective DPI of the system.
- func GetSystemDPI() int {
- // Check for GetDpiForMonitor, introduced in Windows 8.1.
- if _GetDpiForMonitor.Find() == nil {
- hmon := monitorFromPoint(Point{}, MONITOR_DEFAULTTOPRIMARY)
- return getDpiForMonitor(hmon, MDT_EFFECTIVE_DPI)
- } else {
- // Fall back to the physical device DPI.
- screenDC, err := GetDC(0)
- if err != nil {
- return 96
- }
- defer ReleaseDC(screenDC)
- return getDeviceCaps(screenDC, LOGPIXELSX)
- }
- }
- func GetKeyState(nVirtKey int32) int16 {
- c, _, _ := _GetKeyState.Call(uintptr(nVirtKey))
- return int16(c)
- }
- func GetMessage(m *Msg, hwnd syscall.Handle, wMsgFilterMin, wMsgFilterMax uint32) int32 {
- r, _, _ := _GetMessage.Call(uintptr(unsafe.Pointer(m)),
- uintptr(hwnd),
- uintptr(wMsgFilterMin),
- uintptr(wMsgFilterMax))
- return int32(r)
- }
- func GetMessageTime() time.Duration {
- r, _, _ := _GetMessageTime.Call()
- return time.Duration(r) * time.Millisecond
- }
- func GetSystemMetrics(nIndex int) int {
- r, _, _ := _GetSystemMetrics.Call(uintptr(nIndex))
- return int(r)
- }
- // GetWindowDPI returns the effective DPI of the window.
- func GetWindowDPI(hwnd syscall.Handle) int {
- // Check for GetDpiForWindow, introduced in Windows 10.
- if _GetDpiForWindow.Find() == nil {
- dpi, _, _ := _GetDpiForWindow.Call(uintptr(hwnd))
- return int(dpi)
- } else {
- return GetSystemDPI()
- }
- }
- func GetWindowPlacement(hwnd syscall.Handle) *WindowPlacement {
- var wp WindowPlacement
- wp.length = uint32(unsafe.Sizeof(wp))
- _GetWindowPlacement.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&wp)))
- return &wp
- }
- func GetMonitorInfo(hwnd syscall.Handle) MonitorInfo {
- var mi MonitorInfo
- mi.cbSize = uint32(unsafe.Sizeof(mi))
- v, _, _ := _MonitorFromWindow.Call(uintptr(hwnd), MONITOR_DEFAULTTOPRIMARY)
- _GetMonitorInfo.Call(v, uintptr(unsafe.Pointer(&mi)))
- return mi
- }
- func GetWindowLong(hwnd syscall.Handle, index uintptr) (val uintptr) {
- if runtime.GOARCH == "386" {
- val, _, _ = _GetWindowLong32.Call(uintptr(hwnd), index)
- } else {
- val, _, _ = _GetWindowLong.Call(uintptr(hwnd), index)
- }
- return
- }
- func ImmGetContext(hwnd syscall.Handle) syscall.Handle {
- h, _, _ := _ImmGetContext.Call(uintptr(hwnd))
- return syscall.Handle(h)
- }
- func ImmReleaseContext(hwnd, imc syscall.Handle) {
- _ImmReleaseContext.Call(uintptr(hwnd), uintptr(imc))
- }
- func ImmNotifyIME(imc syscall.Handle, action, index, value int) {
- _ImmNotifyIME.Call(uintptr(imc), uintptr(action), uintptr(index), uintptr(value))
- }
- func ImmGetCompositionString(imc syscall.Handle, key int) string {
- size, _, _ := _ImmGetCompositionString.Call(uintptr(imc), uintptr(key), 0, 0)
- if int32(size) <= 0 {
- return ""
- }
- u16 := make([]uint16, size/unsafe.Sizeof(uint16(0)))
- _ImmGetCompositionString.Call(uintptr(imc), uintptr(key), uintptr(unsafe.Pointer(&u16[0])), size)
- return string(utf16.Decode(u16))
- }
- func ImmGetCompositionValue(imc syscall.Handle, key int) int {
- val, _, _ := _ImmGetCompositionString.Call(uintptr(imc), uintptr(key), 0, 0)
- return int(int32(val))
- }
- func ImmSetCompositionWindow(imc syscall.Handle, x, y int) {
- f := CompositionForm{
- dwStyle: CFS_POINT,
- ptCurrentPos: Point{
- X: int32(x), Y: int32(y),
- },
- }
- _ImmSetCompositionWindow.Call(uintptr(imc), uintptr(unsafe.Pointer(&f)))
- }
- func ImmSetCandidateWindow(imc syscall.Handle, x, y int) {
- f := CandidateForm{
- dwStyle: CFS_CANDIDATEPOS,
- ptCurrentPos: Point{
- X: int32(x), Y: int32(y),
- },
- }
- _ImmSetCandidateWindow.Call(uintptr(imc), uintptr(unsafe.Pointer(&f)))
- }
- func SetWindowLong(hwnd syscall.Handle, idx uintptr, style uintptr) {
- if runtime.GOARCH == "386" {
- _SetWindowLong32.Call(uintptr(hwnd), idx, style)
- } else {
- _SetWindowLong.Call(uintptr(hwnd), idx, style)
- }
- }
- func SetWindowPlacement(hwnd syscall.Handle, wp *WindowPlacement) {
- _SetWindowPlacement.Call(uintptr(hwnd), uintptr(unsafe.Pointer(wp)))
- }
- func SetWindowPos(hwnd syscall.Handle, hwndInsertAfter uint32, x, y, dx, dy int32, style uintptr) {
- _SetWindowPos.Call(uintptr(hwnd), uintptr(hwndInsertAfter),
- uintptr(x), uintptr(y),
- uintptr(dx), uintptr(dy),
- style,
- )
- }
- func SetWindowText(hwnd syscall.Handle, title string) {
- wname := syscall.StringToUTF16Ptr(title)
- _SetWindowText.Call(uintptr(hwnd), uintptr(unsafe.Pointer(wname)))
- }
- func GlobalAlloc(size int) (syscall.Handle, error) {
- r, _, err := _GlobalAlloc.Call(GHND, uintptr(size))
- if r == 0 {
- return 0, fmt.Errorf("GlobalAlloc: %v", err)
- }
- return syscall.Handle(r), nil
- }
- func GlobalFree(h syscall.Handle) {
- _GlobalFree.Call(uintptr(h))
- }
- func GlobalLock(h syscall.Handle) (unsafe.Pointer, error) {
- r, _, err := _GlobalLock.Call(uintptr(h))
- if r == 0 {
- return nil, fmt.Errorf("GlobalLock: %v", err)
- }
- return unsafe.Pointer(r), nil
- }
- func GlobalUnlock(h syscall.Handle) {
- _GlobalUnlock.Call(uintptr(h))
- }
- func KillTimer(hwnd syscall.Handle, nIDEvent uintptr) error {
- r, _, err := _SetTimer.Call(uintptr(hwnd), uintptr(nIDEvent), 0, 0)
- if r == 0 {
- return fmt.Errorf("KillTimer failed: %v", err)
- }
- return nil
- }
- func LoadCursor(curID uint16) (syscall.Handle, error) {
- h, _, err := _LoadCursor.Call(0, uintptr(curID))
- if h == 0 {
- return 0, fmt.Errorf("LoadCursorW failed: %v", err)
- }
- return syscall.Handle(h), nil
- }
- func LoadImage(hInst syscall.Handle, res uint32, typ uint32, cx, cy int, fuload uint32) (syscall.Handle, error) {
- h, _, err := _LoadImage.Call(uintptr(hInst), uintptr(res), uintptr(typ), uintptr(cx), uintptr(cy), uintptr(fuload))
- if h == 0 {
- return 0, fmt.Errorf("LoadImageW failed: %v", err)
- }
- return syscall.Handle(h), nil
- }
- func MoveWindow(hwnd syscall.Handle, x, y, width, height int32, repaint bool) {
- var paint uintptr
- if repaint {
- paint = TRUE
- }
- _MoveWindow.Call(uintptr(hwnd), uintptr(x), uintptr(y), uintptr(width), uintptr(height), paint)
- }
- func monitorFromPoint(pt Point, flags uint32) syscall.Handle {
- r, _, _ := _MonitorFromPoint.Call(uintptr(pt.X), uintptr(pt.Y), uintptr(flags))
- return syscall.Handle(r)
- }
- func MsgWaitForMultipleObjectsEx(nCount uint32, pHandles uintptr, millis, mask, flags uint32) (uint32, error) {
- r, _, err := _MsgWaitForMultipleObjectsEx.Call(uintptr(nCount), pHandles, uintptr(millis), uintptr(mask), uintptr(flags))
- res := uint32(r)
- if res == 0xFFFFFFFF {
- return 0, fmt.Errorf("MsgWaitForMultipleObjectsEx failed: %v", err)
- }
- return res, nil
- }
- func OpenClipboard(hwnd syscall.Handle) error {
- r, _, err := _OpenClipboard.Call(uintptr(hwnd))
- if r == 0 {
- return fmt.Errorf("OpenClipboard: %v", err)
- }
- return nil
- }
- func PeekMessage(m *Msg, hwnd syscall.Handle, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool {
- r, _, _ := _PeekMessage.Call(uintptr(unsafe.Pointer(m)), uintptr(hwnd), uintptr(wMsgFilterMin), uintptr(wMsgFilterMax), uintptr(wRemoveMsg))
- return r != 0
- }
- func PostQuitMessage(exitCode uintptr) {
- _PostQuitMessage.Call(exitCode)
- }
- func PostMessage(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) error {
- r, _, err := _PostMessage.Call(uintptr(hwnd), uintptr(msg), wParam, lParam)
- if r == 0 {
- return fmt.Errorf("PostMessage failed: %v", err)
- }
- return nil
- }
- func ReleaseCapture() bool {
- r, _, _ := _ReleaseCapture.Call()
- return r != 0
- }
- func RegisterClassEx(cls *WndClassEx) (uint16, error) {
- a, _, err := _RegisterClassExW.Call(uintptr(unsafe.Pointer(cls)))
- if a == 0 {
- return 0, fmt.Errorf("RegisterClassExW failed: %v", err)
- }
- return uint16(a), nil
- }
- func ReleaseDC(hdc syscall.Handle) {
- _ReleaseDC.Call(uintptr(hdc))
- }
- func SetForegroundWindow(hwnd syscall.Handle) {
- _SetForegroundWindow.Call(uintptr(hwnd))
- }
- func SetFocus(hwnd syscall.Handle) {
- _SetFocus.Call(uintptr(hwnd))
- }
- func SetProcessDPIAware() {
- _SetProcessDPIAware.Call()
- }
- func SetCapture(hwnd syscall.Handle) syscall.Handle {
- r, _, _ := _SetCapture.Call(uintptr(hwnd))
- return syscall.Handle(r)
- }
- func SetClipboardData(format uint32, mem syscall.Handle) error {
- r, _, err := _SetClipboardData.Call(uintptr(format), uintptr(mem))
- if r == 0 {
- return fmt.Errorf("SetClipboardData: %v", err)
- }
- return nil
- }
- func SetCursor(h syscall.Handle) {
- _SetCursor.Call(uintptr(h))
- }
- func SetTimer(hwnd syscall.Handle, nIDEvent uintptr, uElapse uint32, timerProc uintptr) error {
- r, _, err := _SetTimer.Call(uintptr(hwnd), uintptr(nIDEvent), uintptr(uElapse), timerProc)
- if r == 0 {
- return fmt.Errorf("SetTimer failed: %v", err)
- }
- return nil
- }
- func ScreenToClient(hwnd syscall.Handle, p *Point) {
- _ScreenToClient.Call(uintptr(hwnd), uintptr(unsafe.Pointer(p)))
- }
- func ShowWindow(hwnd syscall.Handle, nCmdShow int32) {
- _ShowWindow.Call(uintptr(hwnd), uintptr(nCmdShow))
- }
- func TranslateMessage(m *Msg) {
- _TranslateMessage.Call(uintptr(unsafe.Pointer(m)))
- }
- func UnregisterClass(cls uint16, hInst syscall.Handle) {
- _UnregisterClass.Call(uintptr(cls), uintptr(hInst))
- }
- func UpdateWindow(hwnd syscall.Handle) {
- _UpdateWindow.Call(uintptr(hwnd))
- }
- func (p WindowPlacement) Rect() Rect {
- return p.rcNormalPosition
- }
- func (p WindowPlacement) IsMinimized() bool {
- return p.showCmd == SW_SHOWMINIMIZED
- }
- func (p WindowPlacement) IsMaximized() bool {
- return p.showCmd == SW_SHOWMAXIMIZED
- }
- func (p *WindowPlacement) Set(Left, Top, Right, Bottom int) {
- p.rcNormalPosition.Left = int32(Left)
- p.rcNormalPosition.Top = int32(Top)
- p.rcNormalPosition.Right = int32(Right)
- p.rcNormalPosition.Bottom = int32(Bottom)
- }
|