如何获得的hWnd的子窗口,并使用FindWindowEx API激活

问题描述 投票:-1回答:1

我使用的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也不知道如何来遍历返回的窗口中找到“面板”窗口处理。

winapi access-vba
1个回答
0
投票

对于那些谁可能会遇到在未来类似的问题的好处,我张贴我使用(虽然我很想看到的解决方案使用EnumChildWindows提供作为这似乎是它可能是更好的方法解决,但我不使用API​​足够精明,知道如何设置它)。

该FindWindowEx找不到我一直在寻找,因为控制被埋葬作为父母的孩子的孩子的孩子的孩子的孩子子视频控制窗口。 FindWindowEx将仅搜索前一个父母的孩子。因此,你必须巢埋子控件搜索。

我的步骤如下:

  1. 打开目标应用程序,其窗口和子窗口,你需要从VBA访问。
  2. 运行Spyxx.exe(又名间谍++)
  3. 使用查找窗口工具,让子窗口控件的句柄和标题和类,它的手柄,你需要
  4. 请记下这些项目,然后关闭查找窗口工具
  5. 仍然使用Spyxx.exe,使用菜单项“树/保存树到文件...”(或按Ctrl + S)以窗口的树救出来到一个文本文件(注意保存默认保存它作为一个.sxt间谍++对象,你不想在这里)
  6. 打开您在文本编辑器保存的(这是很好的格式化我使用记事本+ +的)窗口的文本文件的树状列表,并做窗口句柄搜索您在步骤注意#3,#以上4
  7. 这应该定位在子窗口中所需的树
  8. 现在,这棵树落后的工作做下面的步骤,直到你的父窗口的句柄 记下窗口标题为下一级窗口的 - 标题被括在双引号;当你以后编写VBA代码,您将需要一个标题 现在移动到下一个窗口水平并写入该窗口的标题下 继续上移的窗位,直到你到应用程序自身的父窗口

最后一步:现在在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做到这一点,该解决方案将可能是更为优雅。

© www.soinside.com 2019 - 2024. All rights reserved.