【问题标题】:Why is Process.MainWindowTitle always empty for all but one window?为什么 Process.MainWindowTitle 对于除一个窗口外的所有窗口始终为空?
【发布时间】:2012-04-08 15:10:23
【问题描述】:

如下访问 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 - Google - Windows Internet Explorer - iexplore

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

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

我已经阅读了有关 this post 的信息,但我没有进一步了解我的问题(而且它似乎朝着不同的方向发展)。

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

【问题讨论】:

  • 你想达到什么目的?
  • 如果有多个 Internet Explorer 窗口打开,我想通知用户(通过列出具有各自标题的窗口)。再次,这背后的原因是能够自动创建 Internet Explorer 窗口的屏幕截图(将用于测试 Web 应用程序,并在出现错误时处理此信息)。
  • 我不确定这是否有帮助(让我知道,我可以在答案中详细说明),但您可以利用它来发挥自己的优势。即在 IE 周围(以及大多数此类“自动化”),您需要使用一些“临时”技巧。例如。在您的情况下,您可以检查进程的.MainWindowHandle 和您已经在使用的标题 - 如果它为空,则为选项卡,如果您获得更多信息,您可以选择一个真正的窗口,或者接近那个窗口。问题是这个东西会随着 IE 版本的变化而变化,所以你必须调整它。
  • 我想我可能会“仅仅”显示“真实”的 IE 窗口及其活动选项卡(如果存在多个),尽管这不是 100% 的解决方案,而且有点一个肮脏的解决方法。看起来好像只有一个包含 MainWindowTitle 的进程有 MainWindowHandle。
  • @Gorgsenegger 有什么理由你不使用 IE 的 COM 接口(.NET WebBrowser 控件或其他一些包装器)?

标签: c# .net windows


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    实现这一点的一个选择(参见上面的 cmets)是实现 BHO - esp。 DWebBrowserEvents2::WindowStateChanged Event 在这种情况下很有用。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-05-24
        • 1970-01-01
        • 2011-06-09
        • 2015-12-04
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 2020-05-17
        • 1970-01-01
        相关资源
        最近更新 更多