从外部应用程序枚举浏览器选项卡

时间:2009-07-11 00:43:40

标签: browser tabs window external

有点奇怪(具有挑战性的?)问题。是否可以以编程方式从外部应用程序访问打开的浏览器的选项卡?我意识到这是一个模糊的问题,但请听我说:

我正在尝试创建的是“Gmail聊天通知程序”应用程序,当存在未应答的聊天消息时,该应用程序会在Windows系统托盘中闪烁通知图标。目前,据我所知,唯一内置的Gmail聊天通知是:

  1. 启用声音(我不喜欢)
  2. 观看交替闪烁的“Gmail”/“Blah说...”消息的窗口/标签/页面标题。
  3. #2的问题是:当浏览器窗口最小化,并且当Gmail标签不是浏览器中的活动标签时,窗口标题不会更改,我不会注意新的聊天消息。

    所以我想创建一个为我查看标题标题的应用程序。 (所有标签标题,而不仅仅是窗口标题,它只是活动标签标题。)我创建了一个概念验证C#应用程序,通过枚举活动的Windows进程并观察闪烁的“Blah”来检测未答复的聊天消息。说......“在窗口标题中:

    Process[] procs = Process.GetProcesses();
    IntPtr hWnd;
    foreach (Process proc in procs)
        if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
            if (proc.MainWindowTitle.IndexOf(" says… ") >= 0)
            ...
    

    但显而易见的问题是,当Gmail标签不是主动/焦点标签时,它不起作用(因为它只查看窗口标题)。所以我需要能够深入挖掘并查看标题标题的内容。

    我对任何事都持开放态度。我一直在想可能工作的是找到一种方法来枚举浏览器的标签(MDI子窗口?*手指交叉*),但也许这甚至不可能接近:)我也是开放的对于其他解决方案,如果有一种方法可以使用Firefox插件或其他东西(但是与Windows系统托盘集成,而不仅仅是存在于浏览器沙箱中)。

    任何人都可以帮我开始吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

一般来说,这是不可能的。浏览器选项卡不一定是MDI子窗口(实际上,它们几乎肯定不是)。你不知道任意浏览器的窗口树,所以你无法解析它并找出标签(即使你知道它对于特定的浏览器,它肯定是一个实现细节,即使在次要版本之间也可能改变)。事实上,你不知道浏览器是否甚至使用单独的Win32窗口句柄作为选项卡,因为它可能只有一个句柄用于其主窗口,并自己绘制所有内容(例如Qt和WPF应用程序这样做,我相信特别是Opera会这样做,Safari也可能如此。

对此的任何解决方案都必须是特定于浏览器的。您可以为IE和Firefox编写相应的插件,以便将该信息传递给您的应用程序(虽然Firefox插件是沙盒,所以我不确定他们是否能够进行IPC)。我没有看到Opera,Safari或Chrome的任何选项。