我正在创建一个消息窗口,以在与Excel应用程序主窗口不同的队列中接收计时器消息。然后,我可以对该窗口进行子类化,而无需大量无关的内容通过我的(缓慢的)VBA消息循环。
据我了解,我可以将hWndParent
参数和WM_CHILD
样式一起使用,以创建作为主窗口句柄子级的窗口。根据{{3}}:
如果指定的窗口是父窗口或所有者窗口,则DestroyWindow 自动销毁关联的子窗口或拥有的窗口 破坏父窗口或所有者窗口。
因此,我想提供Application.hWnd
作为父级将意味着当我关闭Excel时,所有关联的窗口也将被删除。
但是DestroyWindow docs需要HWND_MESSAGE
作为父项,因此我不确定何时/是否将其清除?
FWIW,这是我用来生成/查找窗口的代码(我的程序可能会丢失其状态,因此我不能依赖于将句柄存储在变量中)
Public Function getMessageWindow(ByVal windowName As String) As hWnd
Const className As String = "Static"
Dim result As hWnd
result = ApiFindWindow(className, windowName)
If result.value.address = 0 Then 'not found
Const HWND_MESSAGE As Long = (-3&)
result = APiCreateWindowEx(0, className, windowName, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0)
End If
getMessageWindow = result
End Function