我想对实际窗口进行子类化,以检测其大小何时发生了变化。这是我尝试使用CallWindowProcW和SetWindowLongW对其进行子类化的代码,但是当我最大化窗口时,它不显示任何消息,因此我认为我错误地设置了其中一些过程。怎么做?var oldWindowProc uintptrfunc 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 回答
白板的微信
TA贡献1883条经验 获得超3个赞
我不知道很多关于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)
}
我确信您可以查看该包装库,并获得更直接的方法。
宝慕林4294392
TA贡献2021条经验 获得超8个赞
您的代码说:
SetWindowLongW(syscall.Stdin,GWLP_WNDPROC,syscall.NewCallback(windowProc))
但是,为什么要将syscall.Stdin传递给SetWindowLongW?您不是应该提供窗把手吗?
- 2 回答
- 0 关注
- 230 浏览
添加回答
举报
0/150
提交
取消