Обновление
Хотя это действительно указано в вопросе, на самом деле я не изучал DWM Thumbnail API и требования функции DwmRegisterThumbnail , а именно:
hwndSource
Дескриптор окна для использования в качестве источника миниатюр.Установка дескриптора окна источника на что-либо кроме типа окна верхнего уровня приведет к возвращаемому значению E_INVALIDARG. [выделение мое]
Подчеркнутое требование делает мой подход с дочерними окнами, полученными с помощью FindWindowEx () , обозначенными ниже недействительными, то есть только FindWindow (* Вместо этого можно использовать для извлечения дескриптора окна верхнего уровня (спасибо Саймону за указание на это) - Ответ Саймона предоставляет соответствующее решение на основе имени класса IE верхнего уровня.окно, по-видимому, создано специально для этой цели.
[...] чтобы использовать вызовы API DWM, я должен передать hwnd, и все вкладки имеют одинаковый дескрипторкак Internet Explorer.
Как вы проверили иерархию окон?Если я проверяю окно IE 9 с помощью, например, Spy ++ , оно открывает следующую иерархию Классы окон (сокращенно):
- IEFrame
- [...]
- Вкладка «Рамка»
- Вкладка «Рамка»
Дочерние окна имеют отдельные дескрипторы, поэтому (из головы) вы сможете получить нужные с помощью соответствующих вызовов функции FindWindowEx , например:
HWND hwndIeTab = ::FindWindowEx(hwndIeFrame, NULL, "Internet Explorer_Server", NULL);
Чтобы получить все нужные вкладки, вам нужно перебрать результаты с помощью второго параметра hwndChildAfter
из FindWindowEx () :
Ручка для дочернего окна.Поиск начинается со следующего дочернего окна в Z-порядке.Дочернее окно должно быть прямым дочерним окном hwndParent, а не просто окном-потомком.
Так что вам нужно сначала выполнить итерации через класс "Tab Tab" и извлечь каждое дочернее окно "Internet Explorer_Server"со вторым вызовом FindWindowEx () по очереди (хотя вы, возможно, захотите поэкспериментировать, будет ли передача дочернего элемента выше с помощью 3-го параметра lpszClass
давать идентичные или лучшие результаты).
Удачи!