Перечислить вкладки браузера из внешнего приложения

Немного странный (сложный?) вопрос. Можно ли программно получить доступ к вкладкам открытого браузера из внешнего приложения? Я понимаю, что это расплывчатый вопрос, но выслушайте меня:

То, что я пытаюсь создать, - это приложение «Gmail Chat Notifier», которое мигает значком уведомления на панели задач Windows, когда существует неотвеченное сообщение чата. На данный момент, насколько я могу судить, единственными встроенными уведомлениями чата Gmail являются:

  1. Включить звуки (что я не предпочитаю)
  2. Следите за заголовком окна/вкладки/страницы, чтобы увидеть попеременно мигающее сообщение «Gmail» / «Блах говорит…».

Проблема с № 2 заключается в следующем: когда окно браузера свернуто, а вкладка Gmail не является активной вкладкой в ​​браузере, заголовок окна не меняется, и я не замечаю новых сообщения чата.

Поэтому я хотел бы создать приложение, которое следит за заголовками вкладок для меня. (Все заголовки вкладок, а не только заголовок окна, который является только заголовком активной вкладки.) Я создал экспериментальное приложение C# для обнаружения неотвеченных сообщений чата, перечисляя активные процессы Windows и наблюдая за мигающим «Блах». говорит..." в заголовке окна:

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, а не просто существовать в песочнице браузера).

Может ли кто-нибудь помочь мне начать? Большое спасибо заранее.


person Michael    schedule 11.07.2009    source источник


Ответы (1)


Это невозможно в общем. Вкладки браузера не обязательно должны быть дочерними окнами MDI (на самом деле они почти наверняка таковыми не являются). Вы не знаете дерево окон произвольного браузера, поэтому вы не можете разобрать его и определить вкладки (и даже если бы вы знали его для конкретного браузера, это определенно деталь реализации, которая, вероятно, изменится даже между младшими выпусками ). На самом деле, вы даже не знаете, использует ли браузер отдельные дескрипторы окна Win32 для вкладок, поскольку он может иметь только один дескриптор для своего главного окна и рисовать все внутри сам по себе (например, приложения Qt и WPF делают это, и я считаю, что Opera, в частности, делает это, и, вероятно, Safari).

Любое решение для этого должно быть специфичным для браузера. Вероятно, вы можете написать соответствующие плагины для IE и Firefox, чтобы передавать эту информацию вашему приложению (хотя плагины Firefox изолированы, поэтому я не уверен, что они вообще могут выполнять IPC). Я не вижу никаких вариантов для Opera, Safari или Chrome.

person Pavel Minaev    schedule 11.07.2009