访问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;
}
因此输出可以是第一次运行,如:
下次运行(预先选择其他IE窗口):
我读过关于this post的内容,但是我的问题没有得到进一步的解决(无论如何它似乎都有一个不同的方向)。
为什么我总是只获得一个非空的MainWindowTitle?
答案 0 :(得分:3)
请记住,Internet Explorer使用托管模型 - 一个iexplore.exe实例托管Internet Explorer框架,其他iexplore.exe实例只显示标签的内容。
唯一具有顶级窗口的IE实例是承载框架的iexplore.exe进程。
This文章讨论了各种Web浏览器的多进程架构。据我了解,浏览器正在转向多进程模型 - 这样一个网页中的失败就不会影响其他页面。 This文章详细介绍了IE的多进程模型。
答案 1 :(得分:1)
实现BHO - esp的一个选项是(实施上述评论)。 DWebBrowserEvents2::WindowStateChanged
Event在这种情况下非常有用。
BHO是一堆COM接口的实现,并被加载到浏览器进程/每个选项卡中...实现它们的最佳方式是在C ++ IMO中。
但是在.NET中肯定可以这样做(虽然不推荐):
答案 2 :(得分:0)
我遇到了同样的问题。使用Teamviewer主机,我们在某些应用程序上有QuickConnect按钮。在我的情况下WinWord。如果您删除或禁用QuickConnect,MainWindowTitle将被增强