首页 文章

何时创建UserForm Windows API句柄?

提问于
浏览
1

我正在编写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 回答

  • 1

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

相关问题