我正在编写Excel 2007 VBA,它使用Windows API调用来管理多个用户表单的Z顺序。我使用以下过程检索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
我希望变量h_lngWndExcel返回一个句柄值,因为它是主Excel窗口的句柄变量。但是我很惊讶地看到h_lngUserDataWSWnd和h_lngUserDataLTWnd变量的值,因为这些是两个用户表单的句柄变量,并且我没有加载任何用户表单(两个用户表单的.Show语句都被注释掉了)。在首次启动上述过程所在的Excel工作簿,启用宏并运行该过程后,我运行了上面的过程代码。
我期望userform处理变量的零,而是获得实际的句柄值。我想理解为什么userform处理没有返回零,因为两个userform都没有加载。是因为Windows(Windows 7,在我的情况下为64位)为userforms生成一个句柄,即使它们从未被显示或加载过吗?首次初始化VBA时是否会生成userform句柄,而不是在显示用户窗体时生成?
答案 0 :(得分:1)
VBA中的Userforms是自动实例化的,因此只要您使用frmUserDataLT.Caption
实际加载表单,这就是它有句柄的原因。