为什么 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
我已经阅读了这篇文章,但我没有进一步解决我的问题(无论如何,它似乎朝着不同的方向发展)。
为什么我总是只得到一个非空的主窗口标题?
请记住,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。如果删除或禁用快速连接,主窗口标题将得到增强