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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb2013 已获得主窗口句柄,怎么遍历所有子窗句柄到TreeView中?相关的知识,希望对你有一定的参考价值。

参考技术A 你可以通过EnumChildWindows(...)函数实现,这个函数玫举属于某个父窗口的所有子窗口。和EnumWindows(...)函数类似,你需要实现一个玫举回调函数,然后EnumChildWindows会依次各个子窗口的句柄传给这个玫举回调函数。知道玫举完所有窗口或者回调函数返回FALSE,玫举才会结束。追问

EnumChildWindows获取的是全部的子窗,不知道怎么实现在TreeView中以父窗句柄为节点的Add

追答

具体的实现步骤,你在网上在搜搜资料啊!

使用窗口句柄作为 VB6 窗体的所有者

【中文标题】使用窗口句柄作为 VB6 窗体的所有者【英文标题】:Use a window handle as an owner for a VB6 form 【发布时间】:2011-10-19 22:21:05 【问题描述】:

Form2.Show vbModeless, Form1 的 Win32 等效项是什么,它允许我将所有者(而不是父级)设置为任意 hWnd 并设置默认位置等? 据我所知,这只能在创建窗口时设置。

【问题讨论】:

在我打电话给.Show 之前,我现在已经通过自己定位来解决这个问题(当然要考虑多台显示器) 除 CreateWindow[Ex] 外,您还可以使用 SetWindowLong[Ptr]GWL_HWNDPARENT 作为 'nIndex' 来设置所有者窗口。 在 DevX 上找到这篇文章。你的问题几乎是逐字逐句的。 devx.com/vb2themax/Tip/18318 我已经很多年没有看过 DevX,我没有意识到它仍然存在 :) 这正是我想要的,但有多个显示器的怪癖(正是我想要的这段代码修复)所以我会坚持使用自定义代码来获取监视器并将其居中。不过,我可能会在以后调整,因为始终处于最佳状态。谢谢 仅供参考,在 VB6 中卸载所有者表单也会卸载所有“由它拥有”的表单,这与仅 API 拥有的 hWnd 的一个主要区别。 【参考方案1】:

我不确定您要完成什么,但我认为您可能正在寻找 SetParent 函数。

Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

hWndChild 是子窗口的句柄。hWndNewParent 是新父窗口的句柄。传递 null(如果我没记错的话是 0)使桌面成为所有者。

你可以找到更多关于它的信息here。

【讨论】:

不,我试图设置所有者(在模态、某些焦点等时禁用)而不是父级(嵌入在另一个窗口中)谢谢。 是的,这对于顶层窗口是正确的。建议使用 SetParent() 而不是 SetWindowLongPtr() 来设置所有者窗口。 @Hans - 你错了,你不能用 SetParent 设置所有者窗口,即使是***窗口也会在 'hWndNewParent' 窗口中作为父窗口。 @Sertac - 不,SetParent() 不会在顶层窗口上设置 WS_CHILD 样式位。检查 MSDN 文档。还要注意使用 CreateWindowEx() 的 hwndParent 参数来创建一个拥有的窗口。 SetWindowLong/Ptr() 的 GWL_HWNDPARENT 值已从文档中删除。 @Hans - MSDN 关于 WS_CHILD 标志的意思是,“API 正在设置父级,但您自己处理自己的样式”。 SetParent 的文档中没有提及所有权。事实上,我能找到的关于该主题的唯一文档是 “在创建拥有的窗口后,应用程序无法将窗口的所有权转移到另一个窗口。” Window Features。 GWL_HWNDPARENT 可能已从文档中删除,但目前它是创建窗口后唯一有效的方法。

以上是关于vb2013 已获得主窗口句柄,怎么遍历所有子窗句柄到TreeView中?的主要内容,如果未能解决你的问题,请参考以下文章

vb2005问题:如何使用enumchildwindows遍历子窗口呀,要一个简单的例子

vb 获取窗口句柄

vb 知道窗口句柄以及怎样获得窗口上文本框和按钮句柄并传递信息

c#获取窗口句柄后 如何遍历所有控件

VB 获取窗口句柄

vb如何获取到窗口的句柄