UINT ThreadProc(LPVOID *pPraram)
{
while(1){ while(!EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL))break;}
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char lpWinTitle[MAX_LINELENGTH];
::GetWindowText(hwnd,lpWinTitle,MAX_LINELENGTH-1);
if(strcmp(lpWinTitle,sTitle)==0)// sTitle:網絡登錄窗口的窗口名
{ gMutex.Lock(INFINITE);//防止兩個線程同時操作
while(EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,NULL));
gMutex.Unlock();
return FALSE;
}
return TRUE;
}
BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam)
{
char sChildName[MAX_LINELENGTH];
::GetClassName(hwnd,sChildName,MAX_LINELENGTH-1);
file://處理編輯控件,登錄窗口中一般只有兩個編輯框,可用MicroSoft Spy++查看窗口的
file://各個子窗口
// 的屬性。通過對比各控件的風格或名字來區別各控件。
if(strcmp(sChildName,"Edit")==0)
{
DWORD dWinSty=::GetWindowLong(hwnd,GWL_STYLE);
if((dWinSty&ES_PASSWORD)==ES_PASSWORD)//這是密碼輸入編輯控件
{
gEventNextPass.SetEvent();//發送“新密碼”事件
WaitForSingleObject(gEventPassOk, INFINITE); file://等待“密碼完成”事件
gEventPassOk.ResetEvent(); file://復位
::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
file://把新密碼填到密碼輸入框,也可用SetWindowText()
bPass=TRUE;//記錄密碼已填入
if(bUser&&(hOk!=NULL))//如果用戶名已填入,“確定”按鈕已找到。
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“確定”按鈕送消息,參照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登錄,初始化
return FALSE;
}
return TRUE;
}
file://非此即彼,這是用戶名輸入編輯控件
if((dWinSty&ES_READONLY)!=ES_READONLY)
{
::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
file://把新用戶名填到用戶名輸入框,也可用SetWindowText()
bUser=TRUE;// 新用戶名已填入用戶名輸入框
if(bPass&&(hOk!=NULL)) 如果密碼已填入,“確定”按鈕已找到。
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“確定”按鈕送消息,參照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登錄,初始化
return FALSE;
}
}
return TRUE;
}
file://如果是按鈕控件
if(strcmp(sChildName,"Button")==0)
{
char sChildTitle[MAX_LINELENGTH];
::GetWindowText(hwnd,sChildTitle,MAX_LINELENGTH-1);
if(strcmp(sChildTitle,sButtonOk)!=0) return TRUE;
// sButtonOk:登錄窗口中“OK”按鈕的標題
hOk=hwnd;//記錄“OK”窗口句柄
if(bUser&&bPass)
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“確定”按鈕送消息,參照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登錄,初始化
return FALSE;
}
return TRUE;
}
return TRUE;
}