更新
虽然确实在问题中指定了,但我实际上并没有具体研究DWM Thumbnail API和DwmRegisterThumbnail 函数的要求:
hwndSource
用作缩略图源的窗口句柄。将源窗口句柄设置为顶级窗口类型以外的任何内容都将导致返回值 E_INVALIDARG。[强调我的]
强调的要求使我的方法与通过下面概述的FindWindowEx()检索的子窗口无效,即只有FindWindow()可能用于检索顶级窗口的句柄(感谢 Simon 指出这一点) - Simon 的回答提供了一个基于顶级 IE 窗口的类名的适当解决方案显然是专门为此目的而呈现的。
[...] 为了使用 DWM API 调用,我必须传入一个 hwnd,并且所有选项卡都与 Internet Explorer 共享相同的句柄。
您如何检查窗口层次结构?如果我使用例如Spy++检查 IE 9 窗口,它会公开以下窗口类层次结构(缩写):
子窗口有单独的句柄,因此(从我的脑海中)您应该能够通过适当调用FindWindowEx 函数来检索所需的句柄,例如:
HWND hwndIeTab = ::FindWindowEx(hwndIeFrame, NULL, "Internet Explorer_Server", NULL);
为了检索所有需要的选项卡,您需要通过FindWindowEx()hwndChildAfter
的第二个参数迭代结果:
子窗口的句柄。搜索从 Z 顺序中的下一个子窗口开始。子窗口必须是 hwndParent 的直接子窗口,而不仅仅是后代窗口。
因此,您需要先通过“Frame Tab”类进行迭代,然后依次通过第二次调用FindWindowEx()来检索每个“Internet Explorer_Server”子窗口(尽管您可能想试验一下,是否通过第三个更高的子窗口参数lpszClass
产生相同或更好的结果)。
祝你好运!