为什么 Process.MainWindowTitle 对于除了一个窗口之外的所有窗口总是为空

本文关键字:窗口 一个 MainWindowTitle Process 为什么 | 更新日期: 2023-09-27 18:30:37

访问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 - 谷歌 - Windows Internet Explorer - iExplore

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

  • 4824 - - iexplore
  • 探索
  • 3208 - - iexplore探索
  • 4864 - id Software - Windows Internet Explorer - iExplore

我已经阅读了这篇文章,但我没有进一步解决我的问题(无论如何,它似乎朝着不同的方向发展)。

为什么我总是只得到一个非空的主窗口标题?

为什么 Process.MainWindowTitle 对于除了一个窗口之外的所有窗口总是为空

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

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

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

可靠地实现这种情况的一种选择(请参阅上面的评论)是实现 BHO - 尤其是DWebBrowserEvents2::WindowStateChanged事件在这种情况下很有用。

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

但肯定可以在 .NET 中执行此操作(尽管不推荐):

  • http://www.codeproject.com/Articles/350432/BHO-Development-using-managed-code
  • http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c19613/Build-a-Managed-BHO-and-Plug-into-the-Browser.htm
  • AddIn-Express for IE(商业库 .基于网络的BHO)

我遇到了同样的问题。使用Teamviewer主机,我们在某些应用程序上具有快速连接按钮。就我而言,WinWord。如果删除或禁用快速连接,主窗口标题将得到增强