【发布时间】:2012-04-08 15:10:23
【问题描述】:
如下访问 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 - - 探索
- 4864 - Google - Windows Internet Explorer - iexplore
下一次运行(预先选择另一个 IE 窗口):
- 4824 - - 探索
- 3208 - - 探索
- 4864 - id 软件 - Windows Internet Explorer - iexplore
我已经阅读了有关 this post 的信息,但我没有进一步了解我的问题(而且它似乎朝着不同的方向发展)。
为什么我总是只能得到一个非空的 MainWindowTitle?
【问题讨论】:
-
你想达到什么目的?
-
如果有多个 Internet Explorer 窗口打开,我想通知用户(通过列出具有各自标题的窗口)。再次,这背后的原因是能够自动创建 Internet Explorer 窗口的屏幕截图(将用于测试 Web 应用程序,并在出现错误时处理此信息)。
-
我不确定这是否有帮助(让我知道,我可以在答案中详细说明),但您可以利用它来发挥自己的优势。即在 IE 周围(以及大多数此类“自动化”),您需要使用一些“临时”技巧。例如。在您的情况下,您可以检查进程的
.MainWindowHandle和您已经在使用的标题 - 如果它为空,则为选项卡,如果您获得更多信息,您可以选择一个真正的窗口,或者接近那个窗口。问题是这个东西会随着 IE 版本的变化而变化,所以你必须调整它。 -
我想我可能会“仅仅”显示“真实”的 IE 窗口及其活动选项卡(如果存在多个),尽管这不是 100% 的解决方案,而且有点一个肮脏的解决方法。看起来好像只有一个包含 MainWindowTitle 的进程有 MainWindowHandle。
-
@Gorgsenegger 有什么理由你不使用 IE 的 COM 接口(.NET WebBrowser 控件或其他一些包装器)?