何时创建 UserForm Windows API 句柄?

When are UserForm Windows API handles created?

我正在编写 Excel 2007 VBA,它使用 Windows API 调用来管理多个用户窗体的 Z 顺序。我正在使用以下过程来检索用户窗体 frmUserDataWS 和 frmUserDataLT 的 Windows API 句柄:

Sub TestZOrder()

Dim h_lngWndExcel As Long
Dim h_lngUserDataWSWnd As Long
Dim h_lngUserDataLTWnd As Long

'frmUserDataLT.Show vbModeless
'frmUserDataWS.Show vbModeless

h_lngWndExcel = Application.hwnd
h_lngUserDataLTWnd = FindWindow("ThunderDFrame", frmUserDataLT.Caption)
h_lngUserDataWSWnd = FindWindow("ThunderDFrame", frmUserDataWS.Caption)

Debug.Print "Excel Application window handle ... " & h_lngWndExcel
Debug.Print "UserDataLT window handle ... " & h_lngUserDataLTWnd
Debug.Print "UserDataWS window handle ... " & h_lngUserDataWSWnd

End Sub

我希望变量 h_lngWndExcel 为 return 一个句柄值,因为它是主要 Excel window 的句柄变量。但是我很惊讶地看到 h_lngUserDataWSWnd 和 h_lngUserDataLTWnd 变量的值,因为它们是两个用户窗体的句柄变量,而且我没有加载任何一个用户窗体(两个用户窗体的 .Show 语句都有被注释掉了)。我 运行 在首先启动上面程序所在的 Excel 工作簿、启用宏和 运行 程序之后,我 运行 上面的程序代码。

我希望用户窗体句柄变量为零,但得到的是实际句柄值。我想了解为什么用户窗体句柄没有 return 零,因为这两个用户窗体都没有加载。是因为 Windows(Windows 7,在我的例子中是 64 位)为用户窗体生成句柄,即使它们从未显示或加载过?是否在 VBA 首次初始化时生成用户表单句柄,而不是在显示用户表单时生成?

VBA 中的用户表单是自动实例化的,因此只要您使用 frmUserDataLT.Caption,您就会实际加载表单,这就是它具有句柄的原因。