5

按如下方式访问 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章
  • 第3208章
  • 4864 - 谷歌 - Windows Internet Explorer - iexplore

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

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

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

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

4

3 回答 3

3

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

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

本文讨论了各种 Web 浏览器的多进程架构。据我了解,浏览器正在转向多进程模型——这样一个网页的故障不会影响其他页面。 本文更详细地介绍了 IE 的多进程模型。

于 2012-04-08T15:24:22.870 回答
1

使这种情况可靠地发生的一种选择(参见上面的评论)是实施BHO - esp。该DWebBrowserEvents2::WindowStateChanged事件在这种情况下很有用。

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

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

于 2012-04-08T16:46:01.110 回答
0

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

于 2015-01-07T14:04:50.803 回答