我使用的MS Access 2016 VBA自动访问外部应用程序。外部应用程序窗口显示在一个子窗口的视频。
如果我使用spyxx.exe,我可以使用“搜索工具”,以获得视频控件的句柄(这改变,当然),标题(“面板”),类别(“wxWindowNR”)和样式(5200)。当我用spyxx.exe返回的句柄,我可以成功地使用该句柄,使正确的应用到顶部并激活它。但是,由于该手柄的变化,我需要动态地获取它使用的MS Access VBA。
我遇到的问题是,我无法弄清楚如何获得相同的处理是spyxx.exe想出了当我使用FindWindowEx API,试图让孩子视频窗口的句柄。下面是我想什么(以及一些对主题的变化):本declartion是:
Public Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
与代码(TRY)来获取子视频窗口的句柄(其中WinHand是父窗口的句柄):
FindWindowEx(WinHand, 0, "wxWindowNR", "panel")
我知道WinHand是父窗口正确的,因为使用WinHand我可以让应用中的活动,最顶层窗口。但是,我永远无法得到FindWindowEx来返回spyxx.exe表演是孩子“面板”窗口的句柄的句柄。
它确实当我离开子窗口的名称空白像这样返回的句柄:
FindWindowEx(WinHand, 0, "wxWindowNR", "")
但从来没有正确的句柄spyxx.exe节目。
从搜索网最多的一天,看来我可能需要做一些与EnumChildWindows API,但我不知道如何引用它在MS Access VBA也不知道如何来遍历返回的窗口中找到“面板”窗口处理。
对于那些谁可能会遇到在未来类似的问题的好处,我张贴我使用(虽然我很想看到的解决方案使用EnumChildWindows提供作为这似乎是它可能是更好的方法解决,但我不使用API足够精明,知道如何设置它)。
该FindWindowEx找不到我一直在寻找,因为控制被埋葬作为父母的孩子的孩子的孩子的孩子的孩子子视频控制窗口。 FindWindowEx将仅搜索前一个父母的孩子。因此,你必须巢埋子控件搜索。
我的步骤如下:
最后一步:现在在VBA代码,找到目标子窗口控件的窗口句柄,你将不得不窝在FindWindowEx命令先从父窗口和工作的方式下是这样的(与任何窗口类取代“wxWindowNR”是有关你正在努力寻找)的子控件:
FindWindowEx (ParentWindowHandle, 0, "wxWindowNR", "[caption from steps 9 to 11]")
例如,这里是我不得不使用(其中ChildWindow5就是我一直在寻找的视频控制窗口的句柄的代码;在While ... WEND命令都需要,因为我所针对的应用程序,不存在所有子窗口时立即运行应用程序):
ParentWindow = 0
While ParentWindow = 0
ParentWindow = FindWindow("Target Window Caption")
Wend
ChildWindow1 = 0
While ChildWindow1 = 0
ChildWindow1 = FindWindowEx(CLng(ParentWindow), 0, "wxWindowNR", "ID_BOOKMARK_SPLITTERWINDOW")
Wend
ChildWindow2 = 0
While ChildWindow2 = 0
ChildWindow2 = FindWindowEx(CLng(ChildWindow1), 0, "wxWindowNR", "ID_TOPPANEL_SPLITTERWINDOW")
Wend
ChildWindow3 = 0
While ChildWindow3 = 0
ChildWindow3 = FindWindowEx(CLng(ChildWindow2), 0, "wxWindowNR", "ID_MAINDISPLAY_PANEL")
Wend
ChildWindow4 = 0
While ChildWindow4 = 0
ChildWindow4 = FindWindowEx(CLng(ChildWindow3), 0, "wxWindowNR", "ID_VIDEODISPLAY_PANEL")
Wend
ChildWindow5 = 0
While ChildWindow5 = 0
ChildWindow5 = FindWindowEx(CLng(ChildWindow4), 0, "wxWindowNR", "panel")
Wend
请注意,对于一个子窗口句柄以后每次搜索引用之前父窗口。
这为我工作。我始终认为,如果有人能指出如何与EnumChildWindows做到这一点,该解决方案将可能是更为优雅。