为什么Process.MainWindowTitle总是空的,除了一个窗口?

当访问Process.MainWindowTitle如下…

Process[] processes = Process.GetProcessesByName( "iexplore" ); 

…然后遍历结果数组,我总是以MainWindowTitle为空,除了数组中的一个MainWindowTitle ,其余都是空的。 在我的情况下,我打开了两个Internet Explorer窗口,一个带有一个选项卡,另一个带有两个选项卡。

运行我的代码,我总是得到窗口和标签,我上次活动的主窗口标题 – 所有其他人保持空白。 奇怪的是,填充MainWindowTitle的进程ID总是相同的 – 如果我在运行代码之前激活另一个IE窗口或Tab,进程ID总是相同的:

  if ( !processes.Any() ) { MessageBox.Show( "TODO - No matching process found" ); return; } if ( processes.Count() > 1 ) { foreach ( Process currentProcess in processes ) { // More than one matching process found checkedListBox1.Items.Add( currentProcess.Id + " - " + currentProcess.MainWindowTitle + " - " + currentProcess.ProcessName ); } return; } 

因此,输出可以是第一次运行,如:

  • 4824 – – iexplore
  • 3208 – – iexplore
  • 4864 – Google – Windows Internet Explorer – iexplore

下一次运行(预先select另一个IE窗口):

  • 4824 – – iexplore
  • 3208 – – iexplore
  • 4864 – id软件 – Windows Internet Explorer – iexplore

我已经阅读了这篇文章 ,但我没有进一步解决我的问题(反正它似乎进入了一个不同的方向)。

为什么我总是只能得到一个非空的MainWindowTitle?

一种可靠的方法来实现这一点(见上面的注释)是实现一个BHO – 特别是。 在这种情况下DWebBrowserEvents2::WindowStateChanged事件是有用的。

BHO是一堆COM接口的实现,并被加载到浏览器进程/每个选项卡中…实现它们的最佳方式是在C ++ IMO中。

但是在.NET中这样做肯定是可以的(虽然不推荐):

请记住,Internet Explorer使用托管模型 – 一个iexplore.exe实例承载Internet Explorer框架,其他iexplore.exe实例只显示选项卡的内容。

唯一具有顶级窗口的IE实例是托管该框架的iexplore.exe进程。

本文讨论了各种Web浏览器的多进程体系结构。 据我所知,浏览器正在转向多进程模型 – 这样一个网页的失败不会影响其他页面。 本文将更详细地介绍IE的多进程模型。

我有同样的问题。 使用Teamviewer主机,我们在某些应用程序上有QuickConnect按钮。 在我的情况下WinWord。 如果您删除或禁用QuickConnect,MainWindowTitle将被增强