给出父窗口处理Open窗口的最有效方法?

时间:2014-03-07 00:12:55

标签: c# winforms fileopendialog

我正在开发一个程序来同时控制一些相同类型的其他程序。

到目前为止,我使用EnumWindows()并收集我将要控制的相应窗口(程序)的句柄。在识别出一些键盘击键后,我遍历所有程序(可能有任意数量的程序打开)并通过使用EnumChildWindows()找到适当的窗口(按钮)来同时发布所有这些程序的点击消息。按下按键,然后使用PostMessage()实际发送点击。

我正在控制的每个程序都有一个名为“加载设置”的按钮,在单击时会打开一个打开文件对话框。我想要做的是首先使用PostMessage()点击“加载设置”(我已经成功地做到了这一点,接下来是我正在尝试做的事情)。然后我想获取该打开文件对话框窗口的句柄,在文本字段中填入我已经确定的相应设置文件的路径,然后单击“打开”按钮完成任务并关闭“打开”窗口

我的主要问题是找到Open window。现在,我可以再次使用EnumWindows找到该窗口,但问题是在单击“加载设置”时,打开窗口无法立即打开。单击按钮后我可以睡觉,然后通过窗口查找它,但这不实用,因为窗口可能需要花费任何时间才能打开。

我已经使用spy ++收集有关此窗口的一些信息,但据我所知,这些都没有帮助。无论如何,这是我发现的:

  • “打开”窗口是打开它的程序的上一个窗口。
  • 窗口“打开”的父级是从中打开的程序。
  • “Open”窗口的所有者是从中打开的程序。

但即使它在其窗口属性下列为主程序的子代,它也与主程序列在同一级别(它不像其他子窗口那样嵌套)。

我尝试过FindWindowEx()和EnumChildWindows(),但都找不到Open窗口。

我认为应该有一些方法,基于一些句柄,获取上一个窗口的句柄。

一旦有效,我需要用适当的文件路径填充编辑(文本字段)窗口。

1 个答案:

答案 0 :(得分:2)

如果你的目标是自动化UI动作(例如测试),那么UIA就是你想要的。 UIA公开了整个UIA树,其中包含机器上所有活动的应用程序。

所以你会看到一个根节点,每个应用程序都有一个子节点。每个节点都应代表该应用程序的顶级窗口。任何进一步的孩子都依赖于申请本身。

UIA Overview

查看更多信息