用vc++穷举windows应用程序密码(下)(4)
{//通过布尔变量m_bEnum 实现循环枚举窗口,若 m_bEnum 为假,线程退出自动销毁
while (m_bEnum)
{ ::EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL);
}
return true;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam )
{
if (!IsWindowVisible(hwnd)) return true;//当窗口不可见时,接着枚举下一窗口
char lpString[128]="";
::GetWindowText(hwnd,(LPSTR)lpString,sizeof(lpString));
//通过窗口标题查找所需窗口
if(strstr(lpString,(const char *)lpszDialogCaption)!=NULL)
{//第一发现所需窗口的线程,获得互斥信号量,其它线程被阻住
::WaitForSingleObject(m_hMutex,INFINITE);
//枚举父窗口下的子窗口
::EnumChildWindows(hwnd,(WNDENUMPROC) EnumChildProc,INPUTDIALOGID);
//线程执行完毕释放信号量,以便另外线程进入
::ReleaseMutex(m_hMutex);
return false;//返回假,枚举过程不再进行
}
if(strstr(lpString,(const char *)lpszDialogRetryCaption)!=NULL)
{::WaitForSingleObject(m_hMutex,INFINITE);
::EnumChildWindows(hwnd,(WNDENUMPROC) EnumChildProc,INPUTRETRYDIALOGID);
::ReleaseMutex(m_hMutex);
return false;
}
return true;非所需窗口,继续枚举
}

