何时创建了UserForm Windows API句柄?

时间:2015-12-17 19:50:20

标签: excel vba excel-vba userform

我正在编写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句柄,而不是在显示用户窗体时生成?

1 个答案:

答案 0 :(得分:1)

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