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 中的垃圾字符