近日由於在華為培訓,期間因為導師們忙得要緊,沒那麼多時間去教導我們,只是給我們看文檔和代碼,看完了,沒事就想出這個來玩玩了。這裡要先用SPY++來找到QQ登陸框的各個窗口標題或ID號。
原理:其實不難,只要找到QQ登陸框的號碼輸入和密碼輸入框,然後向其填數據就是了。這裡填數據就是向其發送消息,模擬鍵盤 罷了。
一、先是查看QQ登陸框是否開啟,否則開啟它。
//找QQ的登陸對話框,如果QQ沒有啟動,則先啟動它。
pWnd = FindWindow(_T("#32770"), _T("QQ用戶登錄"));
if (!pWnd)
{
PROCESS_INFORMATION lpProcessInformation;
STARTUPINFO startupinfo;
memset(&startupinfo,0,sizeof(STARTUPINFO));
memset(&lpProcessInformation,0,sizeof(PROCESS_INFORMATION));
startupinfo.cb = sizeof(STARTUPINFO);
startupinfo.dwFlags = STARTF_FORCEOFFFEEDBACK;
startupinfo.dwX = 0;
startupinfo.dwY = 0;
startupinfo.lpDesktop = NULL;
startupinfo.lpReserved = NULL;
startupinfo.lpReserved2 = NULL;
startupinfo.lpTitle = NULL;
CreateProcess(_T("D:\\Tencent\\qq\\CoralQQ.exe"), NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &startupinfo, &lpProcessInformation);
}
二、開啟和打開後就是取得QQ的號碼框和密碼框的句柄了。這裡要注意的是,因為QQ密碼框是登陸框的子窗口,先要找到登陸框後再一步步找到QQ的密碼框。找到後就是向它們發送消息了。QQ的密碼框先復制到剪切板後發送WM_PASTE就可以了,但是密碼框因為使用了QQ鍵盤加密保護技術,所以不能發送WM_PASTE,而要模擬鍵盤發送WM_CHAR消息,讓其一個一個接收密碼就可以了。
if (pWnd)
{
//獲得QQ的號碼輸入框指針
CComboBox *pCob = (CComboBox *)pWnd->GetDlgItem(138);
if (pCob)
{
m_edtCode.SetSel(0, -1);
m_edtCode.Copy();
//先刪除原有號碼後向號碼輸入框發送復制消息
pCob->SetCurSel(0);
pCob->DeleteString(0);
pCob->SendMessage(WM_PASTE, 0, 0);
}
//因為QQ的密碼框是包含在主窗口裡的子窗口,所以先獲得子窗口後再一個個往後找
CWnd *pCwnd = pWnd->GetNextWindow(GW_CHILD);
pCwnd = pCwnd->GetNextWindow(GW_HWNDNEXT);
while (pCwnd != NULL)
{
if (pCwnd)//找到
{
CEdit *pPwd = (CEdit *)pCwnd->GetDlgItem(16038);
if (pPwd)
{
char cKey;
char buf[20];
memset(buf, 0, sizeof(buf));
//因為我的程序是unicode,所以這裡要轉換。如果不是,則不用轉換了。
int iRet = WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_strPassword.GetBuffer(m_strPassword.GetLength()),
m_strPassword.GetLength(), buf, 20, NULL, NULL);
//清除密碼框
pPwd->SetSel(0, -1);
pPwd->Clear();
i = 0;
//將密碼一個個地發送過去。這裡不能用復制消息,因為QQ的密碼框不允許復制
while (i < iRet)
{
strncpy(&cKey, buf+i, 1);
pPwd->SendMessage(WM_CHAR, (WPARAM)cKey, 0);
i++;
}
break;
}
}
pCwnd = pCwnd->GetNextWindow(GW_HWNDNEXT);
}
三、當填充好號碼和密碼後就可以發送單擊鼠標消息,讓QQ登陸了。
//以下為找到登陸按鈕後,發送鼠標單擊消息
CButton *pbtnLogin = (CButton *)pWnd->GetDlgItem(16032);
if (pbtnLogin)
{
pbtnLogin->PostMessage(WM_LBUTTONDOWN, 0, 0);
pbtnLogin->PostMessage(WM_LBUTTONUP, 0, 0);
}
四、要讓QQ自動登陸,只要加個WM_TIMER就可以了,至於這個大家都會的了,這裡不再講述。
五、結束語:這裡使用到的技術就是向別的進程發送(數據)消息,主要就是要找到對方進程接收消息的句柄(這裡用了SPY++),找到後就可以向其它發送(數據)消息了。比如我前幾天幫別人裝了個PP,但是PP有個浏覽器,只要你開PP這個東東就會出來,我覺得非常礙眼,就可以給它 發送一個WM_HIDE消息。其它的大家可以隨意發揮了!
本文配套源碼