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

Posted

技术标签:

【中文标题】使用窗口句柄作为 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 可能已从文档中删除,但目前它是创建窗口后唯一有效的方法。

以上是关于使用窗口句柄作为 VB6 窗体的所有者的主要内容,如果未能解决你的问题,请参考以下文章

VB获取窗口句柄的详细教程

C#获取当前窗体句柄及该窗体里的信息

C#获取当前窗体句柄及该窗体里的信息

vb 获取窗口句柄

vb如何获取到窗口的句柄

知道一个窗体的句柄,如何获取这个窗体