当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 获得 Win32 窗口句柄的更好的方法
| 获得 Win32 窗口句柄的更好的方法 原文出处:MSDN Magazine C++ Q&A static HWND GetLastChild(HWND hwndParent){ HWND hwnd = hwndParent; while (TRUE) { HWND hwndChild = ::GetWindow(hwnd, GW_CHILD); if (hwndChild==NULL) return hwnd; hwnd = hwndChild; } return NULL;} 通过这个函数返回某个父窗口下的最后一个子窗口,也就是说返回子窗口的子窗口的子窗口......直到不再有子窗口为止。可惜这个函数要获得正确的运行结果是有前提的,那就是窗口层次只能是一层,并且最终的窗口后裔是“Internet Explorer_Server”窗口。 在通常情况下,这个假设都成立。不幸的是,如果 HTML 文档中包含象 ComBoxes(组合框) 这样的控制时,这个假设就不灵了。用 Spy++ 不难发现情况并不象你期望的那样─Internet Explorer_Server是最后的子窗口。实际上,在IE中,Edit 和 Button 控制并非人们所想象的那样是子窗口。 获得 Win32 窗口句柄的更好的方法为了解决这个问题,本文设计了一个更加完善的类:CFindWnd,用更好的算法专门来获取 IE 窗口。CFindWnd 查找某个窗口(给定窗口名字)的第一个子窗口。 例如,它的使用方法如下: CFindWnd ies(m_hWnd, "Internet Explorer_Server");myHwndIE = ies.m_hWnd;这个类的构造函数调用函数: FindChildClassHwnd(hwndParent, (LPARAM)this)函数,该函数又调用: EnumChildWindows 和 FindWindowEx搜索所有后裔窗口直到找到类名匹配窗口为止。FindWindow 用来查找最顶层窗口,而搜索子窗口还得用 FindWindowEx,它是 Win32 API 函数。CFindWnd 返回第一个匹配的窗口,所以它只被用于查找你期望只有一个实例的窗口。通常在搜索特定窗口时,一般最保险的做法都是检查窗口类名。 百家争鸣有一个读者来信指出:根本没有必要使用子类IE窗口的方法来禁用上下 |