golang中的EnumChildWindows回调函数

Posted

技术标签:

【中文标题】golang中的EnumChildWindows回调函数【英文标题】:EnumChildWindows callback function in golang 【发布时间】:2016-05-24 02:00:23 【问题描述】:

在 main 中使用包 lxn/win:

win.EnumChildWindows(hw, printme, 0)

然后在main之后:

func printme(HWND win.HANDLE, LPARAM uintptr)  //HWND hwnd, LPARAM lParam
    spew.Dump(HWND)

我明白了:

.\test.go:40: cannot use printme (type func(win.HANDLE, uintptr)) as type uintptr in argument to win.EnumChildWindows

error:exit status 2

我不明白错误信息。

【问题讨论】:

为了改写错误,printme 参数的类型是 uintptr,而您传递给它的是 func(win.HANDLE, uintptr) 该函数需要回调函数。我如何说服编译器? 你不能“说服”编译器 go 函数是一个 uintptr,因为那根本行不通。什么是lxn/win,有没有使用EnumChildWindows函数的文档? lxn/win 是 windows user32.dll 的接口。除了标准之外,没有其他使用示例:lxn/win。我可以在github上问。 如果这是一个windows系统调用,你可能需要使用syscall.NewCallback(或者syscall.NewCallbackDecl,我对windows一无所知。) 【参考方案1】:

我让它工作了:

win.EnumChildWindows(hwnd, syscall.NewCallback(printme), 0)

func printme(hwnd uintptr, lParam uintptr) uintptr 
    spew.Dump(hwnd)
    fmt.Printf("getWindowText: '%s'\n", getWindowText(hwnd))
    return 1 // true to continue

lxn/win issue 19:

回调签名错误:它必须返回一个类型为int32 (C BOOL) 的非零值,如果函数应该继续枚举。See MSDN。

例如,它可能是:

func printme(hwnd uintptr, lParam uintptr) int32 
    spew.Dump(hwnd)
    return 1 // true to continue

【讨论】:

以上是关于golang中的EnumChildWindows回调函数的主要内容,如果未能解决你的问题,请参考以下文章

NX二次开发-通过获取窗口句柄方式来设置类型过滤器EnumChildWindows

EnumChildWindows 如何得到子窗体句柄的集合? 求高人指点

Xml Unmarshalling 导致 golang 中的垃圾字符

vb2013 已获得主窗口句柄,怎么遍历所有子窗句柄到TreeView中?

golang sql.DB

golang内存扩容