From 6df549b1f019ec116f9d2a2dc3626edf1a6c3e75 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Mon, 20 Jun 2022 16:05:11 +0100 Subject: [PATCH] Refactor (windows). --- date_windows.go | 78 +++++++++++----------- entry_windows.go | 74 ++++++++++----------- file_windows.go | 18 +++--- internal/win/user32.go | 31 +++++++-- internal/win/win32.go | 4 +- internal/win/zsyscall_windows.go | 108 ++++++++++++++++++++++++++----- list_windows.go | 80 +++++++++++------------ msg_windows.go | 6 +- notify_windows.go | 4 +- progress_windows.go | 100 ++++++++++++++-------------- pwd_windows.go | 98 ++++++++++++++-------------- util_windows.go | 78 ++++++++-------------- 12 files changed, 378 insertions(+), 301 deletions(-) diff --git a/date_windows.go b/date_windows.go index e8f3112..92a886b 100644 --- a/date_windows.go +++ b/date_windows.go @@ -27,12 +27,12 @@ type calendarDialog struct { out time.Time err error - wnd uintptr - textCtl uintptr - dateCtl uintptr - okBtn uintptr - cancelBtn uintptr - extraBtn uintptr + wnd win.HWND + textCtl win.HWND + dateCtl win.HWND + okBtn win.HWND + cancelBtn win.HWND + extraBtn win.HWND font font } @@ -59,36 +59,36 @@ func (dlg *calendarDialog) setup(text string, opts options) (time.Time, error) { defer win.UnregisterClass(cls, instance) owner, _ := opts.attach.(win.HWND) - dlg.wnd, _, _ = createWindowEx.Call(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, - uintptr(cls), strptr(*opts.title), + dlg.wnd, _ = win.CreateWindowEx(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, + cls, strptr(*opts.title), _WS_POPUPWINDOW|_WS_CLIPSIBLINGS|_WS_DLGFRAME, _CW_USEDEFAULT, _CW_USEDEFAULT, - 281, 281, uintptr(owner), 0, uintptr(instance), uintptr(unsafe.Pointer(dlg))) + 281, 281, owner, 0, instance, unsafe.Pointer(dlg)) - dlg.textCtl, _, _ = createWindowEx.Call(0, + dlg.textCtl, _ = win.CreateWindowEx(0, strptr("STATIC"), strptr(text), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 10, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 10, 241, 16, dlg.wnd, 0, instance, nil) - var flags uintptr = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _MCS_NOTODAY - dlg.dateCtl, _, _ = createWindowEx.Call(0, + var flags uint32 = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _MCS_NOTODAY + dlg.dateCtl, _ = win.CreateWindowEx(0, strptr(_MONTHCAL_CLASS), - 0, flags, - 12, 30, 241, 164, dlg.wnd, 0, uintptr(instance), 0) + nil, flags, + 12, 30, 241, 164, dlg.wnd, 0, instance, nil) - dlg.okBtn, _, _ = createWindowEx.Call(0, + dlg.okBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.okLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP|_BS_DEFPUSHBUTTON, - 12, 206, 75, 24, dlg.wnd, win.IDOK, uintptr(instance), 0) - dlg.cancelBtn, _, _ = createWindowEx.Call(0, + 12, 206, 75, 24, dlg.wnd, win.IDOK, instance, nil) + dlg.cancelBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.cancelLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 206, 75, 24, dlg.wnd, win.IDCANCEL, uintptr(instance), 0) + 12, 206, 75, 24, dlg.wnd, win.IDCANCEL, instance, nil) if opts.extraButton != nil { - dlg.extraBtn, _, _ = createWindowEx.Call(0, + dlg.extraBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.extraButton), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 206, 75, 24, dlg.wnd, win.IDNO, uintptr(instance), 0) + 12, 206, 75, 24, dlg.wnd, win.IDNO, instance, nil) } if opts.time != nil { @@ -97,13 +97,13 @@ func (dlg *calendarDialog) setup(text string, opts options) (time.Time, error) { date.year = uint16(year) date.month = uint16(month) date.day = uint16(day) - sendMessage.Call(dlg.dateCtl, win.MCM_SETCURSEL, 0, uintptr(unsafe.Pointer(&date))) + win.SendMessagePointer(dlg.dateCtl, win.MCM_SETCURSEL, 0, unsafe.Pointer(&date)) } dlg.layout(getDPI(dlg.wnd)) centerWindow(dlg.wnd) - setFocus.Call(dlg.dateCtl) - showWindow.Call(dlg.wnd, _SW_NORMAL, 0) + win.SetFocus(dlg.dateCtl) + win.ShowWindow(dlg.wnd, _SW_NORMAL) if opts.ctx != nil { wait := make(chan struct{}) @@ -111,7 +111,7 @@ func (dlg *calendarDialog) setup(text string, opts options) (time.Time, error) { go func() { select { case <-opts.ctx.Done(): - sendMessage.Call(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) case <-wait: } }() @@ -128,21 +128,21 @@ func (dlg *calendarDialog) setup(text string, opts options) (time.Time, error) { func (dlg *calendarDialog) layout(dpi dpi) { font := dlg.font.forDPI(dpi) - sendMessage.Call(dlg.textCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.dateCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.okBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.cancelBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.extraBtn, win.WM_SETFONT, font, 1) - setWindowPos.Call(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(281), _SWP_NOZORDER|_SWP_NOMOVE) - setWindowPos.Call(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(dlg.dateCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(164), _SWP_NOZORDER) + win.SendMessage(dlg.textCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.dateCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.okBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.cancelBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.extraBtn, win.WM_SETFONT, font, 1) + win.SetWindowPos(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(281), _SWP_NOZORDER|_SWP_NOMOVE) + win.SetWindowPos(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(dlg.dateCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(164), _SWP_NOZORDER) if dlg.extraBtn == 0 { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(12), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(12), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } @@ -172,7 +172,7 @@ func calendarProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointe return 1 case win.IDOK, win.IDYES: var date _SYSTEMTIME - sendMessage.Call(dlg.dateCtl, win.MCM_GETCURSEL, 0, uintptr(unsafe.Pointer(&date))) + win.SendMessagePointer(dlg.dateCtl, win.MCM_GETCURSEL, 0, unsafe.Pointer(&date)) dlg.out = time.Date(int(date.year), time.Month(date.month), int(date.day), 0, 0, 0, 0, time.UTC) case win.IDCANCEL: dlg.err = ErrCanceled diff --git a/entry_windows.go b/entry_windows.go index 0ed06c7..64b491d 100644 --- a/entry_windows.go +++ b/entry_windows.go @@ -26,12 +26,12 @@ type entryDialog struct { out string err error - wnd uintptr - textCtl uintptr - editCtl uintptr - okBtn uintptr - cancelBtn uintptr - extraBtn uintptr + wnd win.HWND + textCtl win.HWND + editCtl win.HWND + okBtn win.HWND + cancelBtn win.HWND + extraBtn win.HWND font font } @@ -58,46 +58,46 @@ func (dlg *entryDialog) setup(text string, opts options) (string, error) { defer win.UnregisterClass(cls, instance) owner, _ := opts.attach.(win.HWND) - dlg.wnd, _, _ = createWindowEx.Call(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, - uintptr(cls), strptr(*opts.title), + dlg.wnd, _ = win.CreateWindowEx(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, + cls, strptr(*opts.title), _WS_POPUPWINDOW|_WS_CLIPSIBLINGS|_WS_DLGFRAME, _CW_USEDEFAULT, _CW_USEDEFAULT, - 281, 141, uintptr(owner), 0, uintptr(instance), uintptr(unsafe.Pointer(dlg))) + 281, 141, owner, 0, instance, unsafe.Pointer(dlg)) - dlg.textCtl, _, _ = createWindowEx.Call(0, + dlg.textCtl, _ = win.CreateWindowEx(0, strptr("STATIC"), strptr(text), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 10, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 10, 241, 16, dlg.wnd, 0, instance, nil) - var flags uintptr = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _ES_AUTOHSCROLL + var flags uint32 = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _ES_AUTOHSCROLL if opts.hideText { flags |= _ES_PASSWORD } - dlg.editCtl, _, _ = createWindowEx.Call(_WS_EX_CLIENTEDGE, + dlg.editCtl, _ = win.CreateWindowEx(_WS_EX_CLIENTEDGE, strptr("EDIT"), strptr(opts.entryText), flags, - 12, 30, 241, 24, dlg.wnd, 0, uintptr(instance), 0) + 12, 30, 241, 24, dlg.wnd, 0, instance, nil) - dlg.okBtn, _, _ = createWindowEx.Call(0, + dlg.okBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.okLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP|_BS_DEFPUSHBUTTON, - 12, 66, 75, 24, dlg.wnd, win.IDOK, uintptr(instance), 0) - dlg.cancelBtn, _, _ = createWindowEx.Call(0, + 12, 66, 75, 24, dlg.wnd, win.IDOK, instance, nil) + dlg.cancelBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.cancelLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 66, 75, 24, dlg.wnd, win.IDCANCEL, uintptr(instance), 0) + 12, 66, 75, 24, dlg.wnd, win.IDCANCEL, instance, nil) if opts.extraButton != nil { - dlg.extraBtn, _, _ = createWindowEx.Call(0, + dlg.extraBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.extraButton), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 66, 75, 24, dlg.wnd, win.IDNO, uintptr(instance), 0) + 12, 66, 75, 24, dlg.wnd, win.IDNO, instance, nil) } dlg.layout(getDPI(dlg.wnd)) centerWindow(dlg.wnd) - setFocus.Call(dlg.editCtl) - showWindow.Call(dlg.wnd, _SW_NORMAL, 0) - sendMessage.Call(dlg.editCtl, win.EM_SETSEL, 0, intptr(-1)) + win.SetFocus(dlg.editCtl) + win.ShowWindow(dlg.wnd, _SW_NORMAL) + win.SendMessage(dlg.editCtl, win.EM_SETSEL, 0, intptr(-1)) if opts.ctx != nil { wait := make(chan struct{}) @@ -105,7 +105,7 @@ func (dlg *entryDialog) setup(text string, opts options) (string, error) { go func() { select { case <-opts.ctx.Done(): - sendMessage.Call(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) case <-wait: } }() @@ -122,21 +122,21 @@ func (dlg *entryDialog) setup(text string, opts options) (string, error) { func (dlg *entryDialog) layout(dpi dpi) { font := dlg.font.forDPI(dpi) - sendMessage.Call(dlg.textCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.editCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.okBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.cancelBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.extraBtn, win.WM_SETFONT, font, 1) - setWindowPos.Call(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(141), _SWP_NOZORDER|_SWP_NOMOVE) - setWindowPos.Call(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(dlg.editCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) + win.SendMessage(dlg.textCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.editCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.okBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.cancelBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.extraBtn, win.WM_SETFONT, font, 1) + win.SetWindowPos(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(141), _SWP_NOZORDER|_SWP_NOMOVE) + win.SetWindowPos(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(dlg.editCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) if dlg.extraBtn == 0 { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(95), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(95), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(12), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(12), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(66), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } diff --git a/file_windows.go b/file_windows.go index fcac4ea..5e43903 100644 --- a/file_windows.go +++ b/file_windows.go @@ -33,7 +33,7 @@ func selectFile(opts options) (string, error) { args.Flags = win.OFN_NOCHANGEDIR | win.OFN_FILEMUSTEXIST | win.OFN_EXPLORER if opts.title != nil { - args.Title = syscall.StringToUTF16Ptr(*opts.title) + args.Title = strptr(*opts.title) } if opts.showHidden { args.Flags |= win.OFN_FORCESHOWHIDDEN @@ -79,7 +79,7 @@ func selectFileMultiple(opts options) ([]string, error) { args.Flags = win.OFN_NOCHANGEDIR | win.OFN_ALLOWMULTISELECT | win.OFN_FILEMUSTEXIST | win.OFN_EXPLORER if opts.title != nil { - args.Title = syscall.StringToUTF16Ptr(*opts.title) + args.Title = strptr(*opts.title) } if opts.showHidden { args.Flags |= win.OFN_FORCESHOWHIDDEN @@ -150,7 +150,7 @@ func selectFileSave(opts options) (string, error) { args.Flags = win.OFN_NOCHANGEDIR | win.OFN_PATHMUSTEXIST | win.OFN_NOREADONLYRETURN | win.OFN_EXPLORER if opts.title != nil { - args.Title = syscall.StringToUTF16Ptr(*opts.title) + args.Title = strptr(*opts.title) } if opts.confirmOverwrite { args.Flags |= win.OFN_OVERWRITEPROMPT @@ -231,13 +231,13 @@ func pickFolders(opts options, multi bool) (str string, lst []string, err error) } if opts.title != nil { - ptr := syscall.StringToUTF16Ptr(*opts.title) + ptr := strptr(*opts.title) dialog.Call(dialog.SetTitle, uintptr(unsafe.Pointer(ptr))) } if opts.filename != "" { var item *win.IShellItem - ptr := syscall.StringToUTF16Ptr(opts.filename) + ptr := strptr(opts.filename) win.SHCreateItemFromParsingName(ptr, nil, _IID_IShellItem, &item) if int32(hr) >= 0 && item != nil { @@ -318,10 +318,10 @@ func browseForFolder(opts options) (string, []string, error) { args.Flags = win.BIF_RETURNONLYFSDIRS if opts.title != nil { - args.Title = syscall.StringToUTF16Ptr(*opts.title) + args.Title = strptr(*opts.title) } if opts.filename != "" { - args.LParam = syscall.StringToUTF16Ptr(opts.filename) + args.LParam = strptr(opts.filename) args.CallbackFunc = syscall.NewCallback(browseForFolderCallback) } @@ -363,10 +363,10 @@ func initDirNameExt(filename string, name []uint16) (dir *uint16, ext *uint16) { copy(name, syscall.StringToUTF16(n)) } if d != "" { - dir = syscall.StringToUTF16Ptr(d) + dir = strptr(d) } if len(e) > 1 { - ext = syscall.StringToUTF16Ptr(e[1:]) + ext = strptr(e[1:]) } return } diff --git a/internal/win/user32.go b/internal/win/user32.go index b8c3d4a..337b7c7 100644 --- a/internal/win/user32.go +++ b/internal/win/user32.go @@ -86,6 +86,12 @@ func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) { return windows.GetWindowThreadProcessId(hwnd, pid) } +func SendMessagePointer(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Pointer) (ret uintptr) { + r0, _, _ := syscall.Syscall6(procSendMessageW.Addr(), 4, uintptr(wnd), uintptr(msg), uintptr(wparam), uintptr(lparam), 0, 0) + ret = uintptr(r0) + return +} + func GetDpiForWindow(wnd HWND) (ret int, err error) { if err := procGetDpiForWindow.Find(); err != nil { return 0, err @@ -138,7 +144,15 @@ type MSG struct { // https://docs.microsoft.com/en-us/windows/win32/api/windef/ns-windef-point type POINT struct { - x, y int32 + X, Y int32 +} + +// https://docs.microsoft.com/en-us/windows/win32/api/windef/ns-windef-rect +type RECT struct { + Left int32 + Top int32 + Right int32 + Bottom int32 } // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassexw @@ -157,23 +171,32 @@ type WNDCLASSEX struct { IconSm Handle } +//sys CreateIconFromResource(resBits []byte, icon bool, ver uint32) (ret Handle, err error) = user32.CreateIconFromResource +//sys CreateWindowEx(exStyle uint32, className *uint16, windowName *uint16, style uint32, x int, y int, width int, height int, parent HWND, menu Handle, instance Handle, param unsafe.Pointer) (ret HWND, err error) = user32.CreateWindowExW //sys DestroyIcon(icon Handle) (err error) = user32.DestroyIcon //sys DispatchMessage(msg *MSG) (ret uintptr) = user32.DispatchMessageW +//sys EnableWindow(wnd HWND, enable bool) (ok bool) = user32.EnableWindow //sys EnumChildWindows(parent HWND, enumFunc uintptr, lparam unsafe.Pointer) = user32.EnumChildWindows //sys EnumWindows(enumFunc uintptr, lparam unsafe.Pointer) (err error) = user32.EnumChildWindows //sys GetDlgCtrlID(wnd HWND) (ret int) = user32.GetDlgCtrlID //sys getDpiForWindow(wnd HWND) (ret int) = user32.GetDpiForWindow //sys GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr) = user32.GetMessageW //sys GetWindowDC(wnd HWND) (ret Handle) = user32.GetWindowDC +//sys GetWindowRect(wnd HWND, cmdShow *RECT) (err error) = user32.GetWindowRect +//sys GetWindowText(wnd HWND, str *uint16, maxCount int) (ret int, err error) = user32.GetWindowTextW +//sys GetWindowTextLength(wnd HWND) (ret int, err error) = user32.GetWindowTextLengthW //sys IsDialogMessage(wnd HWND, msg *MSG) (ok bool) = user32.IsDialogMessageW //sys LoadIcon(instance Handle, resource uintptr) (ret Handle, err error) = user32.LoadIconW //sys LoadImage(instance Handle, name *uint16, typ int, cx int, cy int, load int) (ret Handle, err error) = user32.LoadImageW -//sys RegisterClassEx(cls *WNDCLASSEX) (ret uint16, err error) = user32.RegisterClassExW +//sys RegisterClassEx(cls *WNDCLASSEX) (err error) = user32.RegisterClassExW //sys ReleaseDC(wnd HWND, dc Handle) (ok bool) = user32.ReleaseDC //sys SendMessage(wnd HWND, msg uint32, wparam uintptr, lparam uintptr) (ret uintptr) = user32.SendMessageW +//sys SetFocus(wnd HWND) (ret HWND, err error) = user32.SetFocus //sys SetForegroundWindow(wnd HWND) (ok bool) = user32.SetForegroundWindow //sys setThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr) = user32.SetThreadDpiAwarenessContext +//sys SetWindowLong(wnd HWND, index int, newLong int) (ret int, err error) = user32.SetWindowLongW +//sys SetWindowPos(wnd HWND, wndInsertAfter HWND, x int, y int, cx int, cy int, flags int) (err error) = user32.SetWindowPos //sys SetWindowText(wnd HWND, text *uint16) (err error) = user32.SetWindowTextW +//sys ShowWindow(wnd HWND, cmdShow int) (ok bool) = user32.ShowWindow //sys TranslateMessage(msg *MSG) (ok bool) = user32.TranslateMessage -//sys UnregisterClass(atom uint16, instance Handle) (err error) = user32.UnregisterClassW -//sys CreateIconFromResource(resBits []byte, resSize int, icon bool, ver uint32) (ret Handle, err error) = user32.CreateIconFromResource +//sys UnregisterClass(className *uint16, instance Handle) (err error) = user32.UnregisterClassW diff --git a/internal/win/win32.go b/internal/win/win32.go index b290a33..9064c96 100644 --- a/internal/win/win32.go +++ b/internal/win/win32.go @@ -9,4 +9,6 @@ type Handle = windows.Handle type HWND = windows.HWND type Pointer = windows.Pointer -//sys RtlGetNtVersionNumbers(major *uint32, minor *uint32, build *uint32) = ntdll.RtlGetNtVersionNumbers +func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) { + return windows.RtlGetNtVersionNumbers() +} diff --git a/internal/win/zsyscall_windows.go b/internal/win/zsyscall_windows.go index b69034b..3d55843 100644 --- a/internal/win/zsyscall_windows.go +++ b/internal/win/zsyscall_windows.go @@ -42,7 +42,6 @@ var ( modcomdlg32 = windows.NewLazySystemDLL("comdlg32.dll") modgdi32 = windows.NewLazySystemDLL("gdi32.dll") modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - modntdll = windows.NewLazySystemDLL("ntdll.dll") modole32 = windows.NewLazySystemDLL("ole32.dll") modshell32 = windows.NewLazySystemDLL("shell32.dll") moduser32 = windows.NewLazySystemDLL("user32.dll") @@ -62,29 +61,37 @@ var ( procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow") procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW") procReleaseActCtx = modkernel32.NewProc("ReleaseActCtx") - procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers") procCoCreateInstance = modole32.NewProc("CoCreateInstance") procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolder") procSHCreateItemFromParsingName = modshell32.NewProc("SHCreateItemFromParsingName") procSHGetPathFromIDListEx = modshell32.NewProc("SHGetPathFromIDListEx") procShell_NotifyIconW = modshell32.NewProc("Shell_NotifyIconW") procCreateIconFromResource = moduser32.NewProc("CreateIconFromResource") + procCreateWindowExW = moduser32.NewProc("CreateWindowExW") procDestroyIcon = moduser32.NewProc("DestroyIcon") procDispatchMessageW = moduser32.NewProc("DispatchMessageW") + procEnableWindow = moduser32.NewProc("EnableWindow") procEnumChildWindows = moduser32.NewProc("EnumChildWindows") procGetDlgCtrlID = moduser32.NewProc("GetDlgCtrlID") procGetDpiForWindow = moduser32.NewProc("GetDpiForWindow") procGetMessageW = moduser32.NewProc("GetMessageW") procGetWindowDC = moduser32.NewProc("GetWindowDC") + procGetWindowRect = moduser32.NewProc("GetWindowRect") + procGetWindowTextLengthW = moduser32.NewProc("GetWindowTextLengthW") + procGetWindowTextW = moduser32.NewProc("GetWindowTextW") procIsDialogMessageW = moduser32.NewProc("IsDialogMessageW") procLoadIconW = moduser32.NewProc("LoadIconW") procLoadImageW = moduser32.NewProc("LoadImageW") procRegisterClassExW = moduser32.NewProc("RegisterClassExW") procReleaseDC = moduser32.NewProc("ReleaseDC") procSendMessageW = moduser32.NewProc("SendMessageW") + procSetFocus = moduser32.NewProc("SetFocus") procSetForegroundWindow = moduser32.NewProc("SetForegroundWindow") procSetThreadDpiAwarenessContext = moduser32.NewProc("SetThreadDpiAwarenessContext") + procSetWindowLongW = moduser32.NewProc("SetWindowLongW") + procSetWindowPos = moduser32.NewProc("SetWindowPos") procSetWindowTextW = moduser32.NewProc("SetWindowTextW") + procShowWindow = moduser32.NewProc("ShowWindow") procTranslateMessage = moduser32.NewProc("TranslateMessage") procUnregisterClassW = moduser32.NewProc("UnregisterClassW") procWTSSendMessageW = modwtsapi32.NewProc("WTSSendMessageW") @@ -183,11 +190,6 @@ func ReleaseActCtx(actCtx Handle) { return } -func RtlGetNtVersionNumbers(major *uint32, minor *uint32, build *uint32) { - syscall.Syscall(procRtlGetNtVersionNumbers.Addr(), 3, uintptr(unsafe.Pointer(major)), uintptr(unsafe.Pointer(minor)), uintptr(unsafe.Pointer(build))) - return -} - func CoCreateInstance(clsid uintptr, unkOuter unsafe.Pointer, clsContext int32, iid uintptr, address unsafe.Pointer) (res error) { r0, _, _ := syscall.Syscall6(procCoCreateInstance.Addr(), 5, uintptr(clsid), uintptr(unkOuter), uintptr(clsContext), uintptr(iid), uintptr(address), 0) if r0 != 0 { @@ -225,7 +227,7 @@ func ShellNotifyIcon(message uint32, data *NOTIFYICONDATA) (ret int, err error) return } -func CreateIconFromResource(resBits []byte, resSize int, icon bool, ver uint32) (ret Handle, err error) { +func CreateIconFromResource(resBits []byte, icon bool, ver uint32) (ret Handle, err error) { var _p0 *byte if len(resBits) > 0 { _p0 = &resBits[0] @@ -234,7 +236,7 @@ func CreateIconFromResource(resBits []byte, resSize int, icon bool, ver uint32) if icon { _p1 = 1 } - r0, _, e1 := syscall.Syscall6(procCreateIconFromResource.Addr(), 5, uintptr(unsafe.Pointer(_p0)), uintptr(len(resBits)), uintptr(resSize), uintptr(_p1), uintptr(ver), 0) + r0, _, e1 := syscall.Syscall6(procCreateIconFromResource.Addr(), 4, uintptr(unsafe.Pointer(_p0)), uintptr(len(resBits)), uintptr(_p1), uintptr(ver), 0, 0) ret = Handle(r0) if ret == 0 { err = errnoErr(e1) @@ -242,6 +244,15 @@ func CreateIconFromResource(resBits []byte, resSize int, icon bool, ver uint32) return } +func CreateWindowEx(exStyle uint32, className *uint16, windowName *uint16, style uint32, x int, y int, width int, height int, parent HWND, menu Handle, instance Handle, param unsafe.Pointer) (ret HWND, err error) { + r0, _, e1 := syscall.Syscall12(procCreateWindowExW.Addr(), 12, 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)) + ret = HWND(r0) + if ret == 0 { + err = errnoErr(e1) + } + return +} + func DestroyIcon(icon Handle) (err error) { r1, _, e1 := syscall.Syscall(procDestroyIcon.Addr(), 1, uintptr(icon), 0, 0) if r1 == 0 { @@ -256,6 +267,16 @@ func DispatchMessage(msg *MSG) (ret uintptr) { return } +func EnableWindow(wnd HWND, enable bool) (ok bool) { + var _p0 uint32 + if enable { + _p0 = 1 + } + r0, _, _ := syscall.Syscall(procEnableWindow.Addr(), 2, uintptr(wnd), uintptr(_p0), 0) + ok = r0 != 0 + return +} + func EnumWindows(enumFunc uintptr, lparam unsafe.Pointer) (err error) { r1, _, e1 := syscall.Syscall(procEnumChildWindows.Addr(), 2, uintptr(enumFunc), uintptr(lparam), 0) if r1 == 0 { @@ -293,6 +314,32 @@ func GetWindowDC(wnd HWND) (ret Handle) { return } +func GetWindowRect(wnd HWND, cmdShow *RECT) (err error) { + r1, _, e1 := syscall.Syscall(procGetWindowRect.Addr(), 2, uintptr(wnd), uintptr(unsafe.Pointer(cmdShow)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func GetWindowTextLength(wnd HWND) (ret int, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowTextLengthW.Addr(), 1, uintptr(wnd), 0, 0) + ret = int(r0) + if ret == 0 { + err = errnoErr(e1) + } + return +} + +func GetWindowText(wnd HWND, str *uint16, maxCount int) (ret int, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(wnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount)) + ret = int(r0) + if ret == 0 { + err = errnoErr(e1) + } + return +} + func IsDialogMessage(wnd HWND, msg *MSG) (ok bool) { r0, _, _ := syscall.Syscall(procIsDialogMessageW.Addr(), 2, uintptr(wnd), uintptr(unsafe.Pointer(msg)), 0) ok = r0 != 0 @@ -317,10 +364,9 @@ func LoadImage(instance Handle, name *uint16, typ int, cx int, cy int, load int) return } -func RegisterClassEx(cls *WNDCLASSEX) (ret uint16, err error) { - r0, _, e1 := syscall.Syscall(procRegisterClassExW.Addr(), 1, uintptr(unsafe.Pointer(cls)), 0, 0) - ret = uint16(r0) - if ret == 0 { +func RegisterClassEx(cls *WNDCLASSEX) (err error) { + r1, _, e1 := syscall.Syscall(procRegisterClassExW.Addr(), 1, uintptr(unsafe.Pointer(cls)), 0, 0) + if r1 == 0 { err = errnoErr(e1) } return @@ -338,6 +384,15 @@ func SendMessage(wnd HWND, msg uint32, wparam uintptr, lparam uintptr) (ret uint return } +func SetFocus(wnd HWND) (ret HWND, err error) { + r0, _, e1 := syscall.Syscall(procSetFocus.Addr(), 1, uintptr(wnd), 0, 0) + ret = HWND(r0) + if ret == 0 { + err = errnoErr(e1) + } + return +} + func SetForegroundWindow(wnd HWND) (ok bool) { r0, _, _ := syscall.Syscall(procSetForegroundWindow.Addr(), 1, uintptr(wnd), 0, 0) ok = r0 != 0 @@ -350,6 +405,23 @@ func setThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr) { return } +func SetWindowLong(wnd HWND, index int, newLong int) (ret int, err error) { + r0, _, e1 := syscall.Syscall(procSetWindowLongW.Addr(), 3, uintptr(wnd), uintptr(index), uintptr(newLong)) + ret = int(r0) + if ret == 0 { + err = errnoErr(e1) + } + return +} + +func SetWindowPos(wnd HWND, wndInsertAfter HWND, x int, y int, cx int, cy int, flags int) (err error) { + r1, _, e1 := syscall.Syscall9(procSetWindowPos.Addr(), 7, uintptr(wnd), uintptr(wndInsertAfter), uintptr(x), uintptr(y), uintptr(cx), uintptr(cy), uintptr(flags), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SetWindowText(wnd HWND, text *uint16) (err error) { r1, _, e1 := syscall.Syscall(procSetWindowTextW.Addr(), 2, uintptr(wnd), uintptr(unsafe.Pointer(text)), 0) if r1 == 0 { @@ -358,14 +430,20 @@ func SetWindowText(wnd HWND, text *uint16) (err error) { return } +func ShowWindow(wnd HWND, cmdShow int) (ok bool) { + r0, _, _ := syscall.Syscall(procShowWindow.Addr(), 2, uintptr(wnd), uintptr(cmdShow), 0) + ok = r0 != 0 + return +} + func TranslateMessage(msg *MSG) (ok bool) { r0, _, _ := syscall.Syscall(procTranslateMessage.Addr(), 1, uintptr(unsafe.Pointer(msg)), 0, 0) ok = r0 != 0 return } -func UnregisterClass(atom uint16, instance Handle) (err error) { - r1, _, e1 := syscall.Syscall(procUnregisterClassW.Addr(), 2, uintptr(atom), uintptr(instance), 0) +func UnregisterClass(className *uint16, instance Handle) (err error) { + r1, _, e1 := syscall.Syscall(procUnregisterClassW.Addr(), 2, uintptr(unsafe.Pointer(className)), uintptr(instance), 0) if r1 == 0 { err = errnoErr(e1) } diff --git a/list_windows.go b/list_windows.go index ba1ecd3..e5f95aa 100644 --- a/list_windows.go +++ b/list_windows.go @@ -43,12 +43,12 @@ type listDialog struct { out []string err error - wnd uintptr - textCtl uintptr - listCtl uintptr - okBtn uintptr - cancelBtn uintptr - extraBtn uintptr + wnd win.HWND + textCtl win.HWND + listCtl win.HWND + okBtn win.HWND + cancelBtn win.HWND + extraBtn win.HWND font font } @@ -75,49 +75,49 @@ func (dlg *listDialog) setup(text string, opts options) ([]string, error) { defer win.UnregisterClass(cls, instance) owner, _ := opts.attach.(win.HWND) - dlg.wnd, _, _ = createWindowEx.Call(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, - uintptr(cls), strptr(*opts.title), + dlg.wnd, _ = win.CreateWindowEx(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, + cls, strptr(*opts.title), _WS_POPUPWINDOW|_WS_CLIPSIBLINGS|_WS_DLGFRAME, _CW_USEDEFAULT, _CW_USEDEFAULT, - 281, 281, uintptr(owner), 0, uintptr(instance), uintptr(unsafe.Pointer(dlg))) + 281, 281, owner, 0, instance, unsafe.Pointer(dlg)) - dlg.textCtl, _, _ = createWindowEx.Call(0, + dlg.textCtl, _ = win.CreateWindowEx(0, strptr("STATIC"), strptr(text), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 10, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 10, 241, 16, dlg.wnd, 0, instance, nil) - var flags uintptr = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _WS_VSCROLL + var flags uint32 = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _WS_VSCROLL if dlg.multiple { flags |= _LBS_EXTENDEDSEL } - dlg.listCtl, _, _ = createWindowEx.Call(_WS_EX_CLIENTEDGE, + dlg.listCtl, _ = win.CreateWindowEx(_WS_EX_CLIENTEDGE, strptr("LISTBOX"), strptr(opts.entryText), flags, - 12, 30, 241, 164, dlg.wnd, 0, uintptr(instance), 0) + 12, 30, 241, 164, dlg.wnd, 0, instance, nil) - dlg.okBtn, _, _ = createWindowEx.Call(0, + dlg.okBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.okLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP|_BS_DEFPUSHBUTTON, - 12, 206, 75, 24, dlg.wnd, win.IDOK, uintptr(instance), 0) - dlg.cancelBtn, _, _ = createWindowEx.Call(0, + 12, 206, 75, 24, dlg.wnd, win.IDOK, instance, nil) + dlg.cancelBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.cancelLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 206, 75, 24, dlg.wnd, win.IDCANCEL, uintptr(instance), 0) + 12, 206, 75, 24, dlg.wnd, win.IDCANCEL, instance, nil) if opts.extraButton != nil { - dlg.extraBtn, _, _ = createWindowEx.Call(0, + dlg.extraBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.extraButton), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 206, 75, 24, dlg.wnd, win.IDNO, uintptr(instance), 0) + 12, 206, 75, 24, dlg.wnd, win.IDNO, instance, nil) } for _, item := range dlg.items { - sendMessage.Call(dlg.listCtl, win.LB_ADDSTRING, 0, strptr(item)) + win.SendMessagePointer(dlg.listCtl, win.LB_ADDSTRING, 0, unsafe.Pointer(strptr(item))) } dlg.layout(getDPI(dlg.wnd)) centerWindow(dlg.wnd) - setFocus.Call(dlg.listCtl) - showWindow.Call(dlg.wnd, _SW_NORMAL, 0) + win.SetFocus(dlg.listCtl) + win.ShowWindow(dlg.wnd, _SW_NORMAL) if opts.ctx != nil { wait := make(chan struct{}) @@ -125,7 +125,7 @@ func (dlg *listDialog) setup(text string, opts options) ([]string, error) { go func() { select { case <-opts.ctx.Done(): - sendMessage.Call(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) case <-wait: } }() @@ -142,21 +142,21 @@ func (dlg *listDialog) setup(text string, opts options) ([]string, error) { func (dlg *listDialog) layout(dpi dpi) { font := dlg.font.forDPI(dpi) - sendMessage.Call(dlg.textCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.listCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.okBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.cancelBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.extraBtn, win.WM_SETFONT, font, 1) - setWindowPos.Call(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(281), _SWP_NOZORDER|_SWP_NOMOVE) - setWindowPos.Call(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(dlg.listCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(164), _SWP_NOZORDER) + win.SendMessage(dlg.textCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.listCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.okBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.cancelBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.extraBtn, win.WM_SETFONT, font, 1) + win.SetWindowPos(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(281), _SWP_NOZORDER|_SWP_NOMOVE) + win.SetWindowPos(dlg.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(dlg.listCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(164), _SWP_NOZORDER) if dlg.extraBtn == 0 { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(12), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(12), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(206), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } @@ -186,18 +186,18 @@ func listProc(wnd uintptr, msg uint32, wparam uintptr, lparam *unsafe.Pointer) u return 1 case win.IDOK, win.IDYES: if dlg.multiple { - if len, _, _ := sendMessage.Call(dlg.listCtl, win.LB_GETSELCOUNT, 0, 0); int32(len) >= 0 { + if len := win.SendMessage(dlg.listCtl, win.LB_GETSELCOUNT, 0, 0); int32(len) >= 0 { dlg.out = make([]string, len) if len > 0 { indices := make([]int32, len) - sendMessage.Call(dlg.listCtl, win.LB_GETSELITEMS, len, uintptr(unsafe.Pointer(&indices[0]))) + win.SendMessage(dlg.listCtl, win.LB_GETSELITEMS, len, uintptr(unsafe.Pointer(&indices[0]))) for i, idx := range indices { dlg.out[i] = dlg.items[idx] } } } } else { - if idx, _, _ := sendMessage.Call(dlg.listCtl, win.LB_GETCURSEL, 0, 0); int32(idx) >= 0 { + if idx := win.SendMessage(dlg.listCtl, win.LB_GETCURSEL, 0, 0); int32(idx) >= 0 { dlg.out = []string{dlg.items[idx]} } else { dlg.out = []string{} diff --git a/msg_windows.go b/msg_windows.go index de457c6..e285146 100644 --- a/msg_windows.go +++ b/msg_windows.go @@ -66,11 +66,11 @@ func message(kind messageKind, text string, opts options) error { var title *uint16 if opts.title != nil { - title = syscall.StringToUTF16Ptr(*opts.title) + title = strptr(*opts.title) } owner, _ := opts.attach.(win.HWND) - s, err := win.MessageBox(owner, syscall.StringToUTF16Ptr(text), title, flags) + s, err := win.MessageBox(owner, strptr(text), title, flags) if opts.ctx != nil && opts.ctx.Err() != nil { return opts.ctx.Err() @@ -107,7 +107,7 @@ func hookMessageDialogCallback(wnd win.HWND, lparam *options) uintptr { text = lparam.extraButton } if text != nil { - win.SetWindowText(wnd, syscall.StringToUTF16Ptr(*text)) + win.SetWindowText(wnd, strptr(*text)) } if ctl == 20 /*IDC_STATIC_OK*/ { diff --git a/notify_windows.go b/notify_windows.go index 12df65f..f19a004 100644 --- a/notify_windows.go +++ b/notify_windows.go @@ -58,9 +58,7 @@ func notify(text string, opts options) error { return err } - var major, minor, build uint32 - win.RtlGetNtVersionNumbers(&major, &minor, &build) - + major, minor, _ := win.RtlGetNtVersionNumbers() // On Windows 7 (6.1) and lower, wait up to 10 seconds to clean up. if major < 6 || major == 6 && minor < 2 { if opts.ctx != nil { diff --git a/progress_windows.go b/progress_windows.go index d2d2701..a58f62f 100644 --- a/progress_windows.go +++ b/progress_windows.go @@ -49,19 +49,19 @@ type progressDialog struct { max int err error - wnd uintptr - textCtl uintptr - progCtl uintptr - okBtn uintptr - cancelBtn uintptr - extraBtn uintptr + wnd win.HWND + textCtl win.HWND + progCtl win.HWND + okBtn win.HWND + cancelBtn win.HWND + extraBtn win.HWND font font } func (d *progressDialog) Text(text string) error { select { default: - setWindowText.Call(d.textCtl, strptr(text)) + win.SetWindowText(d.textCtl, strptr(text)) return nil case <-d.done: return d.err @@ -71,9 +71,9 @@ func (d *progressDialog) Text(text string) error { func (d *progressDialog) Value(value int) error { select { default: - sendMessage.Call(d.progCtl, win.PBM_SETPOS, uintptr(value), 0) + win.SendMessage(d.progCtl, win.PBM_SETPOS, uintptr(value), 0) if value >= d.max { - enableWindow.Call(d.okBtn, 1) + win.EnableWindow(d.okBtn, true) } return nil case <-d.done: @@ -92,11 +92,11 @@ func (d *progressDialog) Done() <-chan struct{} { func (d *progressDialog) Complete() error { select { default: - setWindowLong.Call(d.progCtl, intptr(_GWL_STYLE), _WS_CHILD|_WS_VISIBLE|_PBS_SMOOTH) - sendMessage.Call(d.progCtl, win.PBM_SETRANGE32, 0, 1) - sendMessage.Call(d.progCtl, win.PBM_SETPOS, 1, 0) - enableWindow.Call(d.okBtn, 1) - enableWindow.Call(d.cancelBtn, 0) + win.SetWindowLong(d.progCtl, _GWL_STYLE, _WS_CHILD|_WS_VISIBLE|_PBS_SMOOTH) + win.SendMessage(d.progCtl, win.PBM_SETRANGE32, 0, 1) + win.SendMessage(d.progCtl, win.PBM_SETPOS, 1, 0) + win.EnableWindow(d.okBtn, true) + win.EnableWindow(d.cancelBtn, false) return nil case <-d.done: return d.err @@ -104,7 +104,7 @@ func (d *progressDialog) Complete() error { } func (d *progressDialog) Close() error { - sendMessage.Call(d.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(d.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) <-d.done if d.err == ErrCanceled { return nil @@ -138,50 +138,50 @@ func (dlg *progressDialog) setup(opts options) error { defer win.UnregisterClass(cls, instance) owner, _ := opts.attach.(win.HWND) - dlg.wnd, _, _ = createWindowEx.Call(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, - uintptr(cls), strptr(*opts.title), + dlg.wnd, _ = win.CreateWindowEx(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, + cls, strptr(*opts.title), _WS_POPUPWINDOW|_WS_CLIPSIBLINGS|_WS_DLGFRAME, _CW_USEDEFAULT, _CW_USEDEFAULT, - 281, 133, uintptr(owner), 0, uintptr(instance), uintptr(unsafe.Pointer(dlg))) + 281, 133, owner, 0, instance, unsafe.Pointer(dlg)) - dlg.textCtl, _, _ = createWindowEx.Call(0, - strptr("STATIC"), 0, + dlg.textCtl, _ = win.CreateWindowEx(0, + strptr("STATIC"), nil, _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 10, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 10, 241, 16, dlg.wnd, 0, instance, nil) - var flags uintptr = _WS_CHILD | _WS_VISIBLE | _PBS_SMOOTH + var flags uint32 = _WS_CHILD | _WS_VISIBLE | _PBS_SMOOTH if opts.maxValue < 0 { flags |= _PBS_MARQUEE } - dlg.progCtl, _, _ = createWindowEx.Call(0, + dlg.progCtl, _ = win.CreateWindowEx(0, strptr(_PROGRESS_CLASS), - 0, flags, - 12, 30, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + nil, flags, + 12, 30, 241, 16, dlg.wnd, 0, instance, nil) - dlg.okBtn, _, _ = createWindowEx.Call(0, + dlg.okBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.okLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP|_BS_DEFPUSHBUTTON|_WS_DISABLED, - 12, 58, 75, 24, dlg.wnd, win.IDOK, uintptr(instance), 0) + 12, 58, 75, 24, dlg.wnd, win.IDOK, instance, nil) if !opts.noCancel { - dlg.cancelBtn, _, _ = createWindowEx.Call(0, + dlg.cancelBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.cancelLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 58, 75, 24, dlg.wnd, win.IDCANCEL, uintptr(instance), 0) + 12, 58, 75, 24, dlg.wnd, win.IDCANCEL, instance, nil) } if opts.extraButton != nil { - dlg.extraBtn, _, _ = createWindowEx.Call(0, + dlg.extraBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.extraButton), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 58, 75, 24, dlg.wnd, win.IDNO, uintptr(instance), 0) + 12, 58, 75, 24, dlg.wnd, win.IDNO, instance, nil) } dlg.layout(getDPI(dlg.wnd)) centerWindow(dlg.wnd) - showWindow.Call(dlg.wnd, _SW_NORMAL, 0) + win.ShowWindow(dlg.wnd, _SW_NORMAL) if opts.maxValue < 0 { - sendMessage.Call(dlg.progCtl, win.PBM_SETMARQUEE, 1, 0) + win.SendMessage(dlg.progCtl, win.PBM_SETMARQUEE, 1, 0) } else { - sendMessage.Call(dlg.progCtl, win.PBM_SETRANGE32, 0, uintptr(opts.maxValue)) + win.SendMessage(dlg.progCtl, win.PBM_SETRANGE32, 0, uintptr(opts.maxValue)) } once.Do(dlg.init.Done) @@ -191,7 +191,7 @@ func (dlg *progressDialog) setup(opts options) error { go func() { select { case <-opts.ctx.Done(): - sendMessage.Call(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) case <-wait: } }() @@ -208,28 +208,28 @@ func (dlg *progressDialog) setup(opts options) error { func (d *progressDialog) layout(dpi dpi) { font := d.font.forDPI(dpi) - sendMessage.Call(d.textCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(d.okBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(d.cancelBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(d.extraBtn, win.WM_SETFONT, font, 1) - setWindowPos.Call(d.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(133), _SWP_NOZORDER|_SWP_NOMOVE) - setWindowPos.Call(d.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(d.progCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SendMessage(d.textCtl, win.WM_SETFONT, font, 1) + win.SendMessage(d.okBtn, win.WM_SETFONT, font, 1) + win.SendMessage(d.cancelBtn, win.WM_SETFONT, font, 1) + win.SendMessage(d.extraBtn, win.WM_SETFONT, font, 1) + win.SetWindowPos(d.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(133), _SWP_NOZORDER|_SWP_NOMOVE) + win.SetWindowPos(d.textCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(d.progCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) if d.extraBtn == 0 { if d.cancelBtn == 0 { - setWindowPos.Call(d.okBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.okBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(d.okBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(d.cancelBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.okBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.cancelBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } else { if d.cancelBtn == 0 { - setWindowPos.Call(d.okBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(d.extraBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.okBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.extraBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(d.okBtn, 0, dpi.scale(12), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(d.extraBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(d.cancelBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.okBtn, 0, dpi.scale(12), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.extraBtn, 0, dpi.scale(95), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(d.cancelBtn, 0, dpi.scale(178), dpi.scale(58), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } } diff --git a/pwd_windows.go b/pwd_windows.go index 98ae7ff..1da90be 100644 --- a/pwd_windows.go +++ b/pwd_windows.go @@ -34,14 +34,14 @@ type passwordDialog struct { pwd string err error - wnd uintptr - uTextCtl uintptr - uEditCtl uintptr - pTextCtl uintptr - pEditCtl uintptr - okBtn uintptr - cancelBtn uintptr - extraBtn uintptr + wnd win.HWND + uTextCtl win.HWND + uEditCtl win.HWND + pTextCtl win.HWND + pEditCtl win.HWND + okBtn win.HWND + cancelBtn win.HWND + extraBtn win.HWND font font } @@ -68,53 +68,53 @@ func (dlg *passwordDialog) setup(opts options) (string, string, error) { defer win.UnregisterClass(cls, instance) owner, _ := opts.attach.(win.HWND) - dlg.wnd, _, _ = createWindowEx.Call(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, - uintptr(cls), strptr(*opts.title), + dlg.wnd, _ = win.CreateWindowEx(_WS_EX_CONTROLPARENT|_WS_EX_WINDOWEDGE|_WS_EX_DLGMODALFRAME, + cls, strptr(*opts.title), _WS_POPUPWINDOW|_WS_CLIPSIBLINGS|_WS_DLGFRAME, _CW_USEDEFAULT, _CW_USEDEFAULT, - 281, 191, uintptr(owner), 0, uintptr(instance), uintptr(unsafe.Pointer(dlg))) + 281, 191, owner, 0, instance, unsafe.Pointer(dlg)) - dlg.uTextCtl, _, _ = createWindowEx.Call(0, + dlg.uTextCtl, _ = win.CreateWindowEx(0, strptr("STATIC"), strptr("Username:"), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 10, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 10, 241, 16, dlg.wnd, 0, instance, nil) - var flags uintptr = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _ES_AUTOHSCROLL - dlg.uEditCtl, _, _ = createWindowEx.Call(_WS_EX_CLIENTEDGE, - strptr("EDIT"), 0, + var flags uint32 = _WS_CHILD | _WS_VISIBLE | _WS_GROUP | _WS_TABSTOP | _ES_AUTOHSCROLL + dlg.uEditCtl, _ = win.CreateWindowEx(_WS_EX_CLIENTEDGE, + strptr("EDIT"), nil, flags, - 12, 30, 241, 24, dlg.wnd, 0, uintptr(instance), 0) + 12, 30, 241, 24, dlg.wnd, 0, instance, nil) - dlg.pTextCtl, _, _ = createWindowEx.Call(0, + dlg.pTextCtl, _ = win.CreateWindowEx(0, strptr("STATIC"), strptr("Password:"), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_SS_WORDELLIPSIS|_SS_EDITCONTROL|_SS_NOPREFIX, - 12, 60, 241, 16, dlg.wnd, 0, uintptr(instance), 0) + 12, 60, 241, 16, dlg.wnd, 0, instance, nil) - dlg.pEditCtl, _, _ = createWindowEx.Call(_WS_EX_CLIENTEDGE, - strptr("EDIT"), 0, + dlg.pEditCtl, _ = win.CreateWindowEx(_WS_EX_CLIENTEDGE, + strptr("EDIT"), nil, flags|_ES_PASSWORD, - 12, 80, 241, 24, dlg.wnd, 0, uintptr(instance), 0) + 12, 80, 241, 24, dlg.wnd, 0, instance, nil) - dlg.okBtn, _, _ = createWindowEx.Call(0, + dlg.okBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.okLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP|_BS_DEFPUSHBUTTON, - 12, 116, 75, 24, dlg.wnd, win.IDOK, uintptr(instance), 0) - dlg.cancelBtn, _, _ = createWindowEx.Call(0, + 12, 116, 75, 24, dlg.wnd, win.IDOK, instance, nil) + dlg.cancelBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.cancelLabel), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 116, 75, 24, dlg.wnd, win.IDCANCEL, uintptr(instance), 0) + 12, 116, 75, 24, dlg.wnd, win.IDCANCEL, instance, nil) if opts.extraButton != nil { - dlg.extraBtn, _, _ = createWindowEx.Call(0, + dlg.extraBtn, _ = win.CreateWindowEx(0, strptr("BUTTON"), strptr(*opts.extraButton), _WS_CHILD|_WS_VISIBLE|_WS_GROUP|_WS_TABSTOP, - 12, 116, 75, 24, dlg.wnd, win.IDNO, uintptr(instance), 0) + 12, 116, 75, 24, dlg.wnd, win.IDNO, instance, nil) } dlg.layout(getDPI(dlg.wnd)) centerWindow(dlg.wnd) - setFocus.Call(dlg.uEditCtl) - showWindow.Call(dlg.wnd, _SW_NORMAL, 0) - sendMessage.Call(dlg.uEditCtl, win.EM_SETSEL, 0, intptr(-1)) + win.SetFocus(dlg.uEditCtl) + win.ShowWindow(dlg.wnd, _SW_NORMAL) + win.SendMessage(dlg.uEditCtl, win.EM_SETSEL, 0, intptr(-1)) if opts.ctx != nil { wait := make(chan struct{}) @@ -122,7 +122,7 @@ func (dlg *passwordDialog) setup(opts options) (string, string, error) { go func() { select { case <-opts.ctx.Done(): - sendMessage.Call(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) + win.SendMessage(dlg.wnd, win.WM_SYSCOMMAND, _SC_CLOSE, 0) case <-wait: } }() @@ -139,25 +139,25 @@ func (dlg *passwordDialog) setup(opts options) (string, string, error) { func (dlg *passwordDialog) layout(dpi dpi) { font := dlg.font.forDPI(dpi) - sendMessage.Call(dlg.uTextCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.uEditCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.pTextCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.pEditCtl, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.okBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.cancelBtn, win.WM_SETFONT, font, 1) - sendMessage.Call(dlg.extraBtn, win.WM_SETFONT, font, 1) - setWindowPos.Call(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(191), _SWP_NOZORDER|_SWP_NOMOVE) - setWindowPos.Call(dlg.uTextCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(dlg.uEditCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.pTextCtl, 0, dpi.scale(12), dpi.scale(60), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) - setWindowPos.Call(dlg.pEditCtl, 0, dpi.scale(12), dpi.scale(80), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) + win.SendMessage(dlg.uTextCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.uEditCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.pTextCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.pEditCtl, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.okBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.cancelBtn, win.WM_SETFONT, font, 1) + win.SendMessage(dlg.extraBtn, win.WM_SETFONT, font, 1) + win.SetWindowPos(dlg.wnd, 0, 0, 0, dpi.scale(281), dpi.scale(191), _SWP_NOZORDER|_SWP_NOMOVE) + win.SetWindowPos(dlg.uTextCtl, 0, dpi.scale(12), dpi.scale(10), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(dlg.uEditCtl, 0, dpi.scale(12), dpi.scale(30), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.pTextCtl, 0, dpi.scale(12), dpi.scale(60), dpi.scale(241), dpi.scale(16), _SWP_NOZORDER) + win.SetWindowPos(dlg.pEditCtl, 0, dpi.scale(12), dpi.scale(80), dpi.scale(241), dpi.scale(24), _SWP_NOZORDER) if dlg.extraBtn == 0 { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(95), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(95), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } else { - setWindowPos.Call(dlg.okBtn, 0, dpi.scale(12), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) - setWindowPos.Call(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.okBtn, 0, dpi.scale(12), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.extraBtn, 0, dpi.scale(95), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) + win.SetWindowPos(dlg.cancelBtn, 0, dpi.scale(178), dpi.scale(116), dpi.scale(75), dpi.scale(24), _SWP_NOZORDER) } } diff --git a/util_windows.go b/util_windows.go index 8520470..28cbe0f 100644 --- a/util_windows.go +++ b/util_windows.go @@ -20,35 +20,18 @@ var ( user32 = windows.NewLazySystemDLL("user32.dll") callNextHookEx = user32.NewProc("CallNextHookEx") - createWindowEx = user32.NewProc("CreateWindowExW") defWindowProc = user32.NewProc("DefWindowProcW") destroyWindow = user32.NewProc("DestroyWindow") - enableWindow = user32.NewProc("EnableWindow") getSystemMetrics = user32.NewProc("GetSystemMetrics") - getWindowRect = user32.NewProc("GetWindowRect") - getWindowText = user32.NewProc("GetWindowTextW") - getWindowTextLength = user32.NewProc("GetWindowTextLengthW") postQuitMessage = user32.NewProc("PostQuitMessage") - sendMessage = user32.NewProc("SendMessageW") - setFocus = user32.NewProc("SetFocus") - setWindowLong = user32.NewProc("SetWindowLongW") - setWindowPos = user32.NewProc("SetWindowPos") setWindowsHookEx = user32.NewProc("SetWindowsHookExW") - setWindowText = user32.NewProc("SetWindowTextW") - showWindow = user32.NewProc("ShowWindow") systemParametersInfo = user32.NewProc("SystemParametersInfoW") unhookWindowsHookEx = user32.NewProc("UnhookWindowsHookEx") ) -func intptr(i int64) uintptr { - return uintptr(i) -} - -func strptr(s string) uintptr { - return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s))) -} - -func hwnd(i uint64) win.HWND { return win.HWND(uintptr(i)) } +func intptr(i int64) uintptr { return uintptr(i) } +func strptr(s string) *uint16 { return syscall.StringToUTF16Ptr(s) } +func hwnd(i uint64) win.HWND { return win.HWND(uintptr(i)) } func setup() context.CancelFunc { var wnd win.HWND @@ -161,7 +144,7 @@ func dialogHookProc(code int32, wparam uintptr, lparam *_CWPRETSTRUCT) uintptr { } } if hook.title != nil { - win.SetWindowText(lparam.Wnd, syscall.StringToUTF16Ptr(*hook.title)) + win.SetWindowText(lparam.Wnd, strptr(*hook.title)) } if hook.init != nil { hook.init(lparam.Wnd) @@ -221,9 +204,7 @@ func deleteBackRef(id uintptr) { type dpi int -func getDPI(_wnd uintptr) dpi { - wnd := win.HWND(_wnd) - +func getDPI(wnd win.HWND) dpi { res, _ := win.GetDpiForWindow(wnd) if res != 0 { return dpi(res) @@ -240,11 +221,11 @@ func getDPI(_wnd uintptr) dpi { return dpi(res) } -func (d dpi) scale(dim uintptr) uintptr { +func (d dpi) scale(dim int) int { if d == 0 { return dim } - return dim * uintptr(d) / win.USER_DEFAULT_SCREEN_DPI + return dim * int(d) / win.USER_DEFAULT_SCREEN_DPI } type font struct { @@ -312,12 +293,12 @@ func getIcon(i any) icon { switch { case bytes.HasPrefix(data, []byte("\x00\x00\x01\x00")): res.handle, _ = win.LoadImage(0, - syscall.StringToUTF16Ptr(path), + strptr(path), win.IMAGE_ICON, 0, 0, win.LR_LOADFROMFILE|win.LR_DEFAULTSIZE|win.LR_SHARED) case bytes.HasPrefix(data, []byte("\x89PNG\r\n\x1a\n")): - res.handle, _ = win.CreateIconFromResource( - data, len(data), true, 0x00030000) + res.handle, err = win.CreateIconFromResource( + data, true, 0x00030000) res.destroy = true } return res @@ -330,27 +311,27 @@ func (i *icon) delete() { } } -func centerWindow(wnd uintptr) { +func centerWindow(wnd win.HWND) { getMetric := func(i uintptr) int32 { n, _, _ := getSystemMetrics.Call(i) return int32(n) } - var rect _RECT - getWindowRect.Call(wnd, uintptr(unsafe.Pointer(&rect))) - x := (getMetric(0 /* SM_CXSCREEN */) - (rect.right - rect.left)) / 2 - y := (getMetric(1 /* SM_CYSCREEN */) - (rect.bottom - rect.top)) / 2 - setWindowPos.Call(wnd, 0, uintptr(x), uintptr(y), 0, 0, 0x5) // SWP_NOZORDER|SWP_NOSIZE + var rect win.RECT + win.GetWindowRect(wnd, &rect) + x := (getMetric(0 /* SM_CXSCREEN */) - (rect.Right - rect.Left)) / 2 + y := (getMetric(1 /* SM_CYSCREEN */) - (rect.Bottom - rect.Top)) / 2 + win.SetWindowPos(wnd, 0, int(x), int(y), 0, 0, 0x5) // SWP_NOZORDER|SWP_NOSIZE } -func getWindowString(wnd uintptr) string { - len, _, _ := getWindowTextLength.Call(wnd) +func getWindowString(wnd win.HWND) string { + len, _ := win.GetWindowTextLength(wnd) buf := make([]uint16, len+1) - getWindowText.Call(wnd, uintptr(unsafe.Pointer(&buf[0])), len+1) + win.GetWindowText(wnd, &buf[0], len+1) return syscall.UTF16ToString(buf) } -func registerClass(instance, icon win.Handle, proc uintptr) (uint16, error) { +func registerClass(instance, icon win.Handle, proc uintptr) (*uint16, error) { name := "WC_" + strconv.FormatUint(uint64(proc), 16) var wcx win.WNDCLASSEX @@ -359,9 +340,12 @@ func registerClass(instance, icon win.Handle, proc uintptr) (uint16, error) { wcx.Icon = icon wcx.Instance = instance wcx.Background = 5 // COLOR_WINDOW - wcx.ClassName = syscall.StringToUTF16Ptr(name) + wcx.ClassName = strptr(name) - return win.RegisterClassEx(&wcx) + if err := win.RegisterClassEx(&wcx); err != nil { + return nil, err + } + return wcx.ClassName, nil } // https://stackoverflow.com/questions/4308503/how-to-enable-visual-styles-without-a-manifest @@ -374,8 +358,8 @@ func enableVisualStyles() (cookie uintptr) { var ctx win.ACTCTX ctx.Size = uint32(unsafe.Sizeof(ctx)) ctx.Flags = win.ACTCTX_FLAG_RESOURCE_NAME_VALID | win.ACTCTX_FLAG_SET_PROCESS_DEFAULT | win.ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID - ctx.Source = syscall.StringToUTF16Ptr("shell32.dll") - ctx.AssemblyDirectory = syscall.StringToUTF16Ptr(dir) + ctx.Source = strptr("shell32.dll") + ctx.AssemblyDirectory = strptr(dir) ctx.ResourceName = 124 if hnd, err := win.CreateActCtx(&ctx); err == nil { @@ -413,14 +397,6 @@ type _NONCLIENTMETRICS struct { MessageFont win.LOGFONT } -// https://docs.microsoft.com/en-us/windows/win32/api/windef/ns-windef-rect -type _RECT struct { - left int32 - top int32 - right int32 - bottom int32 -} - // https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime type _SYSTEMTIME struct { year uint16