何时创buildUserForm Windows API句柄?

我正在编写使用Windows API调用pipe理多个用户表单的Z顺序的Excel 2007 VBA。 我正在使用以下过程来检索userforms 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 

我期望variablesh_lngWndExcel返回一个句柄值,因为它是主Excel窗口的句柄variables。 但我很高兴看到h_lngUserDataWSWnd和h_lngUserDataLTWndvariables的值,因为这些是两个用户表单的句柄variables,而且我也不加载任一个用户表单(两个用户表单的.Show语句都被注释掉了)。 在第一次启动上述过程所在的Excel工作簿后,运行上面的过程代码,启用macros并运行过程。

我期望零用户表单句柄variables,而是得到实际的句柄值。 我想了解为什么用户窗体句柄没有返回零,因为没有载入用户窗体。 是否因为Windows(Windows 7,在我的情况是64位)为用户表单生成句柄,即使他们从未显示或加载? 当VBA第一次初始化时,用户窗体句柄是否生成,而不是当用户窗体显示?

VBA中的用户表单是自动实例化的,所以一旦你使用frmUserDataLT.Caption你实际上加载了表单,这就是为什么它有一个句柄。