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