如何找到正在运行的进程的窗口句柄?

时间:2010-02-24 19:40:54

标签: c# .net process window

我正试图从进程中获取窗口的句柄。现在,该过程显示一个启动画面,因此,如果我尝试ProcessInstance.MainWindowHandle,我得到的是该处理主窗口的句柄,即启动画面。

如何找到我想要的窗口?也许如果我能得到一个进程窗口列表,我可以选择我想要的那个。

继承我正在尝试的代码:

AutomationElement aeProcessInstance =
  AutomationElement.FromHandle(mProcess.MainWindowHandle);

AutomationElement aeButton = aeProcessInstance.FindFirst(
  TreeScope.Descendants,
  new PropertyCondition(AutomationElement.NameProperty, "Start"));

aeButton.SetFocus();
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");

2 个答案:

答案 0 :(得分:1)

这是一项具有挑战性的任务。应用程序可以包含任意数量的顶级窗口。这些可以随着应用程序的运行而来去。

我看到你正在使用SendKeys - 你在编写自动化或测试系统吗?如果是这样,您可能希望查看 this question 的已接受答案。

你能更好地解释一下你想做什么吗?例如,您正在使用随机应用程序吗?或者是您可以控制的目标流程?

更新

好的,您的额外信息意味着这个问题更容易处理。您需要使用Spy++,调试器或XperfProcess Explorer或其他工具来处理窗口和线程行为。

一旦你知道了,你就可以使用各种Window management functions找到你需要的窗口并处理它。

另外,请注意Windows Integrity Mechanism。用于在另一个进程中查找窗口并向其发送消息的应用程序必须处于驱动应用程序的更高完整性级别(IL)。

答案 1 :(得分:0)

如果您知道流程中的UI线程的ID,您可以通过消除EnumThreadWindows

找出该线程拥有的窗口
  

EnumThreadWindows函数通过将句柄依次传递给应用程序定义的回调函数,枚举与线程关联的所有非子窗口。 EnumThreadWindows继续,直到枚举最后一个窗口或回调函数返回FALSE。要枚举特定窗口的子窗口,请使用EnumChildWindows函数。

如果应用程序没有显示任何对话框,这应该会给你它的顶级窗口。如果它有对话框,则必须使用窗口的属性来确定哪个是应用程序窗口。窗口样式通常适用于此。