Fix #30.
This commit is contained in:
parent
dc4cafcea5
commit
a3a7512489
3 changed files with 57 additions and 28 deletions
|
@ -44,4 +44,6 @@ func GetSystemDirectory() (string, error) { return windows.GetSystemDirectory()
|
|||
//sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupId int) (err error) = kernel32.GenerateConsoleCtrlEvent
|
||||
//sys GetConsoleWindow() (ret HWND) = kernel32.GetConsoleWindow
|
||||
//sys GetModuleHandle(moduleName *uint16) (ret Handle, err error) = kernel32.GetModuleHandleW
|
||||
//sys GlobalAlloc(flags uint32, bytes uintptr) (ret Handle, err error) = kernel32.GlobalAlloc
|
||||
//sys GlobalFree(mem Handle) (err error) [failretval!=0] = kernel32.GlobalFree
|
||||
//sys ReleaseActCtx(actCtx Handle) = kernel32.ReleaseActCtx
|
||||
|
|
|
@ -281,30 +281,21 @@ func SendMessagePointer(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Poin
|
|||
return
|
||||
}
|
||||
|
||||
func GetDpiForWindow(wnd HWND) (ret int, err error) {
|
||||
if err := procGetDpiForWindow.Find(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return getDpiForWindow(wnd), nil
|
||||
}
|
||||
|
||||
func SetThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr, err error) {
|
||||
if err := procSetThreadDpiAwarenessContext.Find(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return setThreadDpiAwarenessContext(dpiContext), nil
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/windows/win32/winmsg/using-messages-and-message-queues
|
||||
func MessageLoop(wnd HWND) error {
|
||||
msg, err := GlobalAlloc(0, unsafe.Sizeof(MSG{}))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer GlobalFree(msg)
|
||||
|
||||
getMessage := procGetMessageW.Addr()
|
||||
translateMessage := procTranslateMessage.Addr()
|
||||
dispatchMessage := procDispatchMessageW.Addr()
|
||||
isDialogMessage := procIsDialogMessageW.Addr()
|
||||
|
||||
for {
|
||||
var msg MSG
|
||||
s, _, err := syscall.Syscall6(getMessage, 4, uintptr(unsafe.Pointer(&msg)), 0, 0, 0, 0, 0)
|
||||
s, _, err := syscall.Syscall6(getMessage, 4, uintptr(msg), 0, 0, 0, 0, 0)
|
||||
if int32(s) == -1 {
|
||||
return err
|
||||
}
|
||||
|
@ -312,10 +303,10 @@ func MessageLoop(wnd HWND) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
s, _, _ = syscall.Syscall(isDialogMessage, 2, uintptr(wnd), uintptr(unsafe.Pointer(&msg)), 0)
|
||||
s, _, _ = syscall.Syscall(isDialogMessage, 2, uintptr(wnd), uintptr(msg), 0)
|
||||
if s == 0 {
|
||||
syscall.Syscall(translateMessage, 1, uintptr(unsafe.Pointer(&msg)), 0, 0)
|
||||
syscall.Syscall(dispatchMessage, 1, uintptr(unsafe.Pointer(&msg)), 0, 0)
|
||||
syscall.Syscall(translateMessage, 1, uintptr(msg), 0, 0)
|
||||
syscall.Syscall(dispatchMessage, 1, uintptr(msg), 0, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -398,8 +389,8 @@ type CWPRETSTRUCT struct {
|
|||
//sys EnableWindow(wnd HWND, enable bool) (ok bool) = user32.EnableWindow
|
||||
//sys EnumWindows(enumFunc uintptr, lparam unsafe.Pointer) (err error) = user32.EnumChildWindows
|
||||
//sys GetDlgItem(dlg HWND, dlgItemID int) (ret HWND, err error) = user32.GetDlgItem
|
||||
//sys getDpiForWindow(wnd HWND) (ret int) = user32.GetDpiForWindow
|
||||
//sys GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr) = user32.GetMessageW
|
||||
//sys GetDpiForWindow(wnd HWND) (ret int, err error) [false] = user32.GetDpiForWindow?
|
||||
//sys GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr, err error) [int32(failretval)==-1] = user32.GetMessageW
|
||||
//sys GetSystemMetrics(index int) (ret int) = user32.GetSystemMetrics
|
||||
//sys GetWindowDC(wnd HWND) (ret Handle) = user32.GetWindowDC
|
||||
//sys GetWindowRect(wnd HWND, cmdShow *RECT) (err error) = user32.GetWindowRect
|
||||
|
@ -415,7 +406,7 @@ type CWPRETSTRUCT struct {
|
|||
//sys SetDlgItemText(dlg HWND, dlgItemID int, str *uint16) (err error) = user32.SetDlgItemTextW
|
||||
//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 SetThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr, err error) [false] = 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 SetWindowsHookEx(idHook int, fn uintptr, mod Handle, threadID uint32) (ret Handle, err error) = user32.SetWindowsHookExW
|
||||
|
|
|
@ -61,6 +61,8 @@ var (
|
|||
procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent")
|
||||
procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
|
||||
procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW")
|
||||
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
||||
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
||||
procReleaseActCtx = modkernel32.NewProc("ReleaseActCtx")
|
||||
procCoCreateInstance = modole32.NewProc("CoCreateInstance")
|
||||
procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolder")
|
||||
|
@ -203,6 +205,23 @@ func GetModuleHandle(moduleName *uint16) (ret Handle, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func GlobalAlloc(flags uint32, bytes uintptr) (ret Handle, err error) {
|
||||
r0, _, e1 := syscall.Syscall(procGlobalAlloc.Addr(), 2, uintptr(flags), uintptr(bytes), 0)
|
||||
ret = Handle(r0)
|
||||
if ret == 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GlobalFree(mem Handle) (err error) {
|
||||
r1, _, e1 := syscall.Syscall(procGlobalFree.Addr(), 1, uintptr(mem), 0, 0)
|
||||
if r1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ReleaseActCtx(actCtx Handle) {
|
||||
syscall.Syscall(procReleaseActCtx.Addr(), 1, uintptr(actCtx), 0, 0)
|
||||
return
|
||||
|
@ -332,15 +351,25 @@ func GetDlgItem(dlg HWND, dlgItemID int) (ret HWND, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func getDpiForWindow(wnd HWND) (ret int) {
|
||||
r0, _, _ := syscall.Syscall(procGetDpiForWindow.Addr(), 1, uintptr(wnd), 0, 0)
|
||||
func GetDpiForWindow(wnd HWND) (ret int, err error) {
|
||||
err = procGetDpiForWindow.Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
r0, _, e1 := syscall.Syscall(procGetDpiForWindow.Addr(), 1, uintptr(wnd), 0, 0)
|
||||
ret = int(r0)
|
||||
if false {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr) {
|
||||
r0, _, _ := syscall.Syscall6(procGetMessageW.Addr(), 4, uintptr(unsafe.Pointer(msg)), uintptr(wnd), uintptr(msgFilterMin), uintptr(msgFilterMax), 0, 0)
|
||||
func GetMessage(msg *MSG, wnd HWND, msgFilterMin uint32, msgFilterMax uint32) (ret uintptr, err error) {
|
||||
r0, _, e1 := syscall.Syscall6(procGetMessageW.Addr(), 4, uintptr(unsafe.Pointer(msg)), uintptr(wnd), uintptr(msgFilterMin), uintptr(msgFilterMax), 0, 0)
|
||||
ret = uintptr(r0)
|
||||
if int32(ret) == -1 {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -454,9 +483,16 @@ func SetForegroundWindow(wnd HWND) (ok bool) {
|
|||
return
|
||||
}
|
||||
|
||||
func setThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr) {
|
||||
r0, _, _ := syscall.Syscall(procSetThreadDpiAwarenessContext.Addr(), 1, uintptr(dpiContext), 0, 0)
|
||||
func SetThreadDpiAwarenessContext(dpiContext uintptr) (ret uintptr, err error) {
|
||||
err = procSetThreadDpiAwarenessContext.Find()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
r0, _, e1 := syscall.Syscall(procSetThreadDpiAwarenessContext.Addr(), 1, uintptr(dpiContext), 0, 0)
|
||||
ret = uintptr(r0)
|
||||
if false {
|
||||
err = errnoErr(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue