方法一通过API GetWindow 递归枚举:
VOID OutputWindow(HWND hWnd){TCHAR szTitle[256] = {0};GetWindowText(hWnd, szTitle, sizeof(szTitle) / sizeof(TCHAR));TCHAR szBuffer[MAX_PATH] = {0};_sntprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1, _T("HWND(%x), Title(%s)/n"), (UINT)hWnd, szTitle);OutputDebugString(szBuffer);}void EnumChild(HWND hParent){if(hParent != NULL){HWND hChild = GetWindow(hParent, GW_CHILD);while(hChild != NULL){EnumChild(hChild);OutputWindow(hChild);hChild = GetWindow(hChild, GW_HWNDNEXT);}}}
方法二 通过API EnumChildWindows:
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam){ if(IsWindowVisible(hwnd)) { char sName[128]={0}; GetClassName(hwnd, sName, 128); if(stricmp(sName, "xx")==0) { *(HWND*)lParam=hwnd; } } return TRUE;}
EnumChildWindows(hwnd, EnumChildProc, (LPARAM)&parentwnd);
强烈推荐使用方法二!