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