猿问

如何在Windows中对窗口进行子类化?(使用Go)

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


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


    }

}


守候你守候我
浏览 231回答 2
2回答

白板的微信

我不知道很多关于WINAPI,但似乎你的代码非常相似的例子的go-winapi包装使用该包装器库,此修改后的版本似乎对我有用:(完整代码)剪断// window procedurefunc 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

您的代码说:SetWindowLongW(syscall.Stdin,GWLP_WNDPROC,syscall.NewCallback(windowProc))但是,为什么要将syscall.Stdin传递给SetWindowLongW?您不是应该提供窗把手吗?
随时随地看视频慕课网APP

相关分类

Go
我要回答