4

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

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

  1. 启用声音(我不喜欢)
  2. 观察交替闪烁的“Gmail”/“Blah 说...”消息的窗口/选项卡/页面标题。

#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 系统托盘集成,而不仅仅是存在于浏览器沙箱中)。

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

4

1 回答 1

1

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

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

于 2009-07-11T01:10:01.710 回答