Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Process.MainWindowTitle对于除一个窗口外的所有窗口始终为空?_C#_.net_Windows - Fatal编程技术网

C# 为什么Process.MainWindowTitle对于除一个窗口外的所有窗口始终为空?

C# 为什么Process.MainWindowTitle对于除一个窗口外的所有窗口始终为空?,c#,.net,windows,C#,.net,Windows,访问Process.MainWindowTitle时,如下所示 Process[] processes = Process.GetProcessesByName( "iexplore" ); …然后在生成的数组上循环,我总是以数组中除一项外的所有项的MainWindowTitle为空结束。在我的例子中,我打开了两个Internet Explorer窗口,一个有一个选项卡,另一个有两个选项卡 运行我的代码时,我总是会得到我上次激活的窗口和选项卡的MainWindowTitle,其他所有的都是空的

访问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--iexplore
  • 4864-Google-Windows Internet Explorer-iexplore
下一次运行(事先选择另一个IE窗口):

  • 4824--探索
  • 3208--iexplore
  • 4864-id软件-Windows Internet Explorer-iexplore
我已经读过了,但是我的问题没有得到进一步的解决(而且它似乎进入了一个不同的方向)


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

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

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


本文讨论了各种web浏览器的多进程体系结构。据我所知,浏览器正在向多进程模式发展——这样,一个网页中的故障不会影响其他网页。这篇文章更详细地介绍了IE的多进程模型。

可靠地实现这一点的一个选择(见上面的评论)是实现a-esp。在这种情况下,a-esp是有用的

BHO是一组COM接口的实现,并加载到浏览器进程/每个选项卡中。。。最好的实现方法是在C++ IMO中。 但是在.NET中这样做当然是可能的(尽管不推荐):

  • (基于.NET的BHO商业图书馆)

    • 我也有同样的问题。使用Teamviewer主机,我们在某些应用程序上有QuickConnect按钮。就我而言,WinWord。如果删除或禁用QuickConnect,MainWindowTitle将得到增强

      您想实现什么?我想通知用户是否打开了多个Internet Explorer窗口(通过列出带有各自标题的窗口)。同样,这背后的原因是能够自动创建Internet Explorer窗口的屏幕截图(用于测试web应用程序,并在出现错误时处理此信息)。我不确定这是否有帮助(请告诉我,我可以在回答中详细说明),但您可以利用这一点。i、 e.对于周围的IE(以及大多数类似的“自动化”),你需要使用一些“临时”技巧。例如,在您的情况下,您可以检查流程的
      .MainWindowHandle
      ,以及您已经使用的标题-如果选项卡为空,如果您获得更多信息,您可以选择一个真正的窗口,或者接近该窗口。问题是,随着IE版本的变化,这种情况会发生变化,所以你必须对其进行调整。我认为,我可能不会“仅仅”显示“真正的”IE窗口及其活动选项卡(如果存在多个),尽管这不是100%的解决方案,也有点麻烦。看起来似乎只有一个包含MainWindowTitle的进程有一个MainWindowHandle。@Gorgsenegger您为什么不使用IE的COM接口(无论是.NET WebBrowser控件还是其他包装器)?