【问题标题】:Most efficient way to get the handle of an Open window given its parent?在给定父级的情况下获取打开窗口句柄的最有效方法是什么?
【发布时间】:2014-03-07 00:12:55
【问题描述】:

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

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

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

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

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

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

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

我试过 FindWindowEx() 和 EnumChildWindows() 但都找不到打开的窗口。

我认为应该有某种方法可以根据某个句柄获取上一个窗口的句柄。

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

【问题讨论】:

  • 顺便说一句,您最好使用System.Windows.Automation。它是为这类事情设计的,它是一个 .NET 库,因此您可以避免 P/Invoke。这是examples 中的couple
  • 我从未使用过甚至听说过自动化,我一定会研究它。谢谢

标签: c# winforms fileopendialog


【解决方案1】:

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

所以你会看到一个根节点,每个应用程序都有一个子节点。这些节点中的每一个都应代表该应用程序的顶级窗口。任何其他子级都取决于应用程序本身。

UIA Overview查看更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2010-11-24
    相关资源
    最近更新 更多