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

标签 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}");

最佳答案

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

我看到您正在使用 SendKeys - 您是在编写自动化系统还是测试系统?如果是这样,您可能需要查看对 this question 的已接受答案.

你能更好地解释一下你想做什么吗?例如,您是否使用随机应用程序?还是您可以控制目标过程?

更新

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

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

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

关于c# - 如何找到正在运行的进程的窗口句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328931/

相关文章:

linux - 从处理器的角度进行进程调度

c# - .NET 进程间通信的最佳选择是什么?

c# - 使用 .net webservice 以像素为单位发送图像

c# - 对要分配给 Combobox 的列表进行排序

C# 并非所有代码路径都返回值数据收集器类项目

c# - 从 URI 到复杂类型的 ASP.net WebApi 参数绑定(bind)

c# - RxExp 匹配第一个标签

c# - 对于某些键名,RSACryptoServiceProvider(RSACryptoServiceProvider) 构造函数在 .NET 3.5 中崩溃

C++ Qt 在单独的进程中运行应用程序的各个部分

c# - Entity Framework 6 日期时间问题