我正在编写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变量的值,因为这些是两个userforms的句柄变量,并且我没有加载任何userform(两个userforms的.Show语句都被注释掉了) . 在首次启动上述过程所在的Excel工作簿,启用宏并运行该过程后,我运行了上面的过程代码 .
我期望用户形式处理变量的零,而是获得实际的句柄值 . 我想了解为什么userform句柄没有返回零,因为两个userform都没有加载 . 是因为Windows(Windows 7,在我的情况下为64位)为userforms生成一个句柄,即使它们从未被显示或加载过吗?首次初始化VBA时是否生成userform句柄,而不是在显示用户窗体时生成?
1 回答
VBA中的Userforms是自动实例化的,因此只要您使用
frmUserDataLT.Caption
实际加载表单,这就是它有句柄的原因 .