何时创建 UserForm Windows API 句柄?
When are UserForm Windows API handles created?
我正在编写 Excel 2007 VBA,它使用 Windows API 调用来管理多个用户窗体的 Z 顺序。我正在使用以下过程来检索用户窗体 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 为 return 一个句柄值,因为它是主要 Excel window 的句柄变量。但是我很惊讶地看到 h_lngUserDataWSWnd 和 h_lngUserDataLTWnd 变量的值,因为它们是两个用户窗体的句柄变量,而且我没有加载任何一个用户窗体(两个用户窗体的 .Show 语句都有被注释掉了)。我 运行 在首先启动上面程序所在的 Excel 工作簿、启用宏和 运行 程序之后,我 运行 上面的程序代码。
我希望用户窗体句柄变量为零,但得到的是实际句柄值。我想了解为什么用户窗体句柄没有 return 零,因为这两个用户窗体都没有加载。是因为 Windows(Windows 7,在我的例子中是 64 位)为用户窗体生成句柄,即使它们从未显示或加载过?是否在 VBA 首次初始化时生成用户表单句柄,而不是在显示用户表单时生成?
VBA 中的用户表单是自动实例化的,因此只要您使用 frmUserDataLT.Caption
,您就会实际加载表单,这就是它具有句柄的原因。
我正在编写 Excel 2007 VBA,它使用 Windows API 调用来管理多个用户窗体的 Z 顺序。我正在使用以下过程来检索用户窗体 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 为 return 一个句柄值,因为它是主要 Excel window 的句柄变量。但是我很惊讶地看到 h_lngUserDataWSWnd 和 h_lngUserDataLTWnd 变量的值,因为它们是两个用户窗体的句柄变量,而且我没有加载任何一个用户窗体(两个用户窗体的 .Show 语句都有被注释掉了)。我 运行 在首先启动上面程序所在的 Excel 工作簿、启用宏和 运行 程序之后,我 运行 上面的程序代码。
我希望用户窗体句柄变量为零,但得到的是实际句柄值。我想了解为什么用户窗体句柄没有 return 零,因为这两个用户窗体都没有加载。是因为 Windows(Windows 7,在我的例子中是 64 位)为用户窗体生成句柄,即使它们从未显示或加载过?是否在 VBA 首次初始化时生成用户表单句柄,而不是在显示用户表单时生成?
VBA 中的用户表单是自动实例化的,因此只要您使用 frmUserDataLT.Caption
,您就会实际加载表单,这就是它具有句柄的原因。