Как отобразить открытые вкладки IE в виде эскизов DWM? - PullRequest
11 голосов
/ 11 февраля 2012

Я создаю приложение WPF на C # и хочу отобразить миниатюры открытых вкладок IE в списке.По сути, я пытаюсь дублировать функциональность DWM в Windows 7.

Windows 7 showing open IE tabs

Я выяснил, как перечислить список открытых вкладок, используя Interop.ShDocVW, но для того, чтобыиспользовать вызовы DWM API, я должен передать hwnd, и все вкладки имеют тот же дескриптор, что и Internet Explorer.

Так что я возился с EnumWindows и EnumChildWindows, но яне могу заставить что-либо работать.

Есть предложения, как лучше всего к этому подойти?

Ответы [ 3 ]

6 голосов
/ 14 февраля 2012

Этот код перечисляет дескрипторы окна, которые соответствуют миниатюрам IE, и могут использоваться в качестве параметра hwndSource функции DwmRegisterThumbnail

public static IEnumerable<IntPtr> EnumerateIEDwmThumbnails()
{
    List<IntPtr> ptrs = new List<IntPtr>();
    StringBuilder cls = new StringBuilder(100);
    EnumWindows((hwnd, lparam) =>
    {
        GetClassName(hwnd, cls, cls.Capacity);
        if (cls.ToString() == "TabThumbnailWindow")
        {
            ptrs.Add(hwnd);
        }
        return true;
    }, IntPtr.Zero);
    return ptrs;
}

[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsCallback lpEnumFunc, IntPtr lParam);
private delegate bool EnumWindowsCallback(IntPtr hwnd, IntPtr lParam);

[DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
5 голосов
/ 13 февраля 2012

Обновление

Хотя это действительно указано в вопросе, на самом деле я не изучал DWM Thumbnail API и требования функции DwmRegisterThumbnail , а именно:

hwndSource

Дескриптор окна для использования в качестве источника миниатюр.Установка дескриптора окна источника на что-либо кроме типа окна верхнего уровня приведет к возвращаемому значению E_INVALIDARG. [выделение мое]

Подчеркнутое требование делает мой подход с дочерними окнами, полученными с помощью FindWindowEx () , обозначенными ниже недействительными, то есть только FindWindow (* Вместо этого можно использовать для извлечения дескриптора окна верхнего уровня (спасибо Саймону за указание на это) - Ответ Саймона предоставляет соответствующее решение на основе имени класса IE верхнего уровня.окно, по-видимому, создано специально для этой цели.


[...] чтобы использовать вызовы API DWM, я должен передать hwnd, и все вкладки имеют одинаковый дескрипторкак Internet Explorer.

Как вы проверили иерархию окон?Если я проверяю окно IE 9 с помощью, например, Spy ++ , оно открывает следующую иерархию Классы окон (сокращенно):

  • IEFrame
    • [...]
    • Вкладка «Рамка»
      • [...]
    • Вкладка «Рамка»
      • [...]
      • TabWindowClass
        • Оболочка DocObject View
          • Internet Explorer_Server

Дочерние окна имеют отдельные дескрипторы, поэтому (из головы) вы сможете получить нужные с помощью соответствующих вызовов функции FindWindowEx , например:

HWND hwndIeTab = ::FindWindowEx(hwndIeFrame, NULL, "Internet Explorer_Server", NULL);

Чтобы получить все нужные вкладки, вам нужно перебрать результаты с помощью второго параметра hwndChildAfter из FindWindowEx () :

Ручка для дочернего окна.Поиск начинается со следующего дочернего окна в Z-порядке.Дочернее окно должно быть прямым дочерним окном hwndParent, а не просто окном-потомком.

Так что вам нужно сначала выполнить итерации через класс "Tab Tab" и извлечь каждое дочернее окно "Internet Explorer_Server"со вторым вызовом FindWindowEx () по очереди (хотя вы, возможно, захотите поэкспериментировать, будет ли передача дочернего элемента выше с помощью 3-го параметра lpszClass давать идентичные или лучшие результаты).

Удачи!

1 голос
/ 18 февраля 2012

Решением, с которым я пошел, было использование EnumWindows и GetWindowText из Win32 API.Я перечисляю через окна Internet Explorer, используя shdocvw.dll, и передаю заголовок вкладки методу, который анализирует результаты GetWindowText, чтобы найти hwnd окна с этим заголовком.

Это работает для всех окон IE,не только вкладки.

...