我想对实际窗口进行子类化以检测其大小何时发生变化。
这是我尝试使用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 {
}
}
答案 0 :(得分:2)
我对winapi了解不多,但似乎是closely resembles an example的代码go-winapi
wrapper
使用该包装器lib,这个修改后的版本似乎对我有用:
剪断
// 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?你不是想提供窗口把手吗?
亚历