1

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

这是我尝试使用 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 {

    }
}
4

2 回答 2

2

我对winapi不太了解,但您的代码似乎非常类似于包装器示例go-winapi

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

完整代码

剪断

// 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)
}

我相信您可以查看该包装器库并得出更直接的方法。

于 2012-09-13T22:09:12.870 回答
0

你的代码说:

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

但是为什么要将 syscall.Stdin 传递给 SetWindowLongW?您不打算提供窗口句柄吗?

亚历克斯

于 2012-09-14T00:52:30.957 回答