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

时间:2012-04-08 15:10:24

标签: c# .net windows

访问Process.MainWindowTitle时如下...

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

...然后遍历生成的数组,我总是以MainWindowTitle为空,除了数组中的一个项目。在我的情况下,我有两个Internet Explorer窗口打开,一个有一个标签,一个有两个标签。

运行我的代码我总是得到我最后一次活动的窗口和标签的MainWindowTitle - 所有其他的都是空的。奇怪的是,填充MainWindowTitle的进程ID始终是相同的 - 如果我在运行代码之前激活其他IE窗口或选项卡,则进程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

下次运行(预先选择其他IE窗口):

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

我读过关于this post的内容,但是我的问题没有得到进一步的解决(无论如何它似乎都有一个不同的方向)。

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

3 个答案:

答案 0 :(得分:3)

请记住,Internet Explorer使用托管模型 - 一个iexplore.exe实例托管Internet Explorer框架,其他iexplore.exe实例只显示标签的内容。

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

This文章讨论了各种Web浏览器的多进程架构。据我了解,浏览器正在转向多进程模型 - 这样一个网页中的失败就不会影响其他页面。 This文章详细介绍了IE的多进程模型。

答案 1 :(得分:1)

实现BHO - esp的一个选项是(实施上述评论)。 DWebBrowserEvents2::WindowStateChanged Event在这种情况下非常有用。

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

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

答案 2 :(得分:0)

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