为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守候你守候我 2021-05-14 18:11:27
我想对实际窗口进行子类化,以检测其大小何时发生了变化。这是我尝试使用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)

}

我确信您可以查看该包装库,并获得更直接的方法。


查看完整回答
反对 回复 2021-05-17
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您的代码说:

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

但是,为什么要将syscall.Stdin传递给SetWindowLongW?您不是应该提供窗把手吗?


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信