我想對實際窗口進行子類化,以檢測其大小何時發生了變化。這是我嘗試使用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 關注
- 269 瀏覽
添加回答
舉報
0/150
提交
取消