此代码枚举与IE缩略图对应的窗口句柄,可用作DwmRegisterThumbnail函数的hwndSource参数
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);
Run Code Online (Sandbox Code Playgroud)
虽然确实在问题中指出,但我实际上没有特别关注DWM Thumbnail API和DwmRegisterThumbnail函数的要求:
hwndSource
窗口的句柄用作缩略图源.将源窗口句柄设置为顶级窗口类型以外的任何内容将导致返回值为E_INVALIDARG.[强调我的]
强调的要求使得通过下面概述的FindWindowEx()检索到的子窗口的方法无效,即只能使用FindWindow()来检索顶级窗口的句柄(感谢Simon指出这一点) - Simon的答案提供了基于顶级IE窗口的类名称的适当解决方案,显然是专门为此目的而呈现的.
[...]为了使用DWM API调用,我必须传入一个hwnd,并且所有选项卡都与Internet Explorer共享相同的句柄.
你是如何检查窗口层次结构的?如果我用例如Spy ++检查IE 9窗口,它会公开以下Window类的层次结构(缩写):
子窗口有单独的句柄,所以(从我的头顶)你应该能够通过适当调用FindWindowEx函数来检索所需的句柄,例如:
HWND hwndIeTab = ::FindWindowEx(hwndIeFrame, NULL, "Internet Explorer_Server", NULL);
Run Code Online (Sandbox Code Playgroud)
为了获取所有需要的标签,你需要第二个参数的方法来遍历结果hwndChildAfter的FindWindowEx() :
子窗口的句柄.搜索从Z顺序中的下一个子窗口开始.子窗口必须是hwndParent的直接子窗口,而不仅仅是后代窗口.
因此,您需要首先通过类"Frame Tab"进行迭代,然后依次调用FindWindowEx()来检索每个"Internet Explorer_Server"子窗口(尽管您可能需要进行实验,无论是否将孩子传递到第3个参数lpszClass产生相同或更好的结果).
祝好运!
我采用的解决方案是使用Win32 API 中的EnumWindowsand 。GetWindowText我使用枚举了 Internet Explorer 窗口,shdocvw.dll并将选项卡的标题传递给解析结果的方法,GetWindowText以查找具有该标题的窗口的 hwnd。
这适用于所有 IE 窗口,而不仅仅是选项卡。