如何在Windows中子窗口? (使用Go)

时间:2012-09-13 20:55:56

标签: windows go subclass

我想对实际窗口进行子类化以检测其大小何时发生变化。

这是我尝试使用CallWindowProcW和SetWindowLongW对其进行子类化的相关代码,但是当我最大化窗口时它没有显示任何消息,所以我认为我错误地设置了一些这些过程。怎么做?

var oldWindowProc uintptr

func windowProc(hwnd syscall.Handle, msg uint32, wparam, lparam uintptr) (rc uintptr) {
    switch msg {
    case WM_SIZE:
        fmt.Println("Size")
        if wparam == SIZE_MAXIMIZED {
            fmt.Println("Changed!")
        }
    default:
        return CallWindowProcW(oldWindowProc, hwnd, msg, wparam, lparam)
    }
    return 0
}

func main() {
    oldWindowProc, _ = SetWindowLongW(syscall.Stdin, GWLP_WNDPROC,
        syscall.NewCallback(windowProc))

    for {

    }
}

2 个答案:

答案 0 :(得分:2)

我对winapi了解不多,但似乎是closely resembles an example的代码go-winapi wrapper

使用该包装器lib,这个修改后的版本似乎对我有用:

Full code

剪断

// window procedure
func WndProc(hwnd winapi.HWND, msg uint32, wparam uintptr, lparam uintptr) uintptr {
    switch msg {
    case winapi.WM_SIZE:
        if wparam == SIZE_MAXIMIZED {
            fmt.Println("Changed!")
        }
    }
    // call original procedure
    return winapi.CallWindowProc(uintptr(oldWndProc), hwnd, msg, wparam, lparam)
}

我相信你可以查看那个包装器lib并获得更直接的方法。

答案 1 :(得分:0)

你的代码说:

SetWindowLongW(syscall.Stdin,GWLP_WNDPROC,syscall.NewCallback(windowProc))

但是为什么要将syscall.Stdin传递给SetWindowLongW?你不是想提供窗口把手吗?

亚历