需求:免費 QQ 用戶無群發功能,手動逐個發送極其繁瑣。利用 Windows 訊息機制,模擬使用者操作:尋找聊天視窗 → 定位輸入框 → 寫入文字 → 點擊發送按鈕。本文提供完整 VC6 MFC 實作碼 (約 20KB),適用 QQ 2004 SP1 / Win2000 SP4。
FindWindowEx 遍歷頂層視窗。#32770 (對話框) → AfxWnd42 (MFC 視圖) → RICHEDIT (富文本編輯控制項)。CRichEditCtrl* 指標,SetSel 移至末尾 → ReplaceSel 插入文字。SendMessage(BM_CLICK)。
void CMySMSDlg::QQSendMessage()
{
CString str;
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd) {
HWND hWnd, hNext;
hWnd = pMainWnd->m_hWnd;
pMainWnd->GetWindowText(str);
if (str.Find(_T("聊天")) > -1) { // 找到聊天主視窗
// 1. 穿透層級找 RichEdit
hWnd = FindWindowEx(pMainWnd->m_hWnd, NULL, _T("#32770"), NULL);
pMainWnd = CWnd::FromHandle(hWnd);
hWnd = FindWindowEx(pMainWnd->m_hWnd, NULL, _T("AfxWnd42"), NULL);
CWnd* pChildWnd = CWnd::FromHandle(hWnd);
int nLen = str.GetLength();
hNext = FindWindowEx(pChildWnd->m_hWnd, NULL, _T("RICHEDIT"), NULL);
if (hNext) {
CRichEditCtrl* pRich = (CRichEditCtrl*)CWnd::FromHandle(hNext);
pRich->GetWindowText(str);
pRich->SetSel(nLen, nLen);
pRich->ReplaceSel(_T("成都外國語學校 黃東")); // 發送內容
} else return;
// 2. 找發送按鈕並點擊
hWnd = FindWindowEx(pMainWnd->m_hWnd, NULL, NULL, NULL);
while (hWnd) {
pChildWnd = CWnd::FromHandle(hWnd);
pChildWnd->GetWindowText(str);
if (str.Find(_T("發送")) > -1) {
pChildWnd->SendMessage(BM_CLICK); // 發送
return;
}
hWnd = FindWindowEx(pMainWnd->m_hWnd, hWnd, NULL, NULL);
}
return;
}
pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT); // 繼續找下一視窗
}
}
FindWindowEx(parent, childAfter, className, windowName) — 精確定位控制項層級。CRichEditCtrl::ReplaceSel — 在游標位置插入文字,支援 Unicode/ANSI 自動轉換。SendMessage(BM_CLICK) — 模擬按鈕點擊,比 PostMessage 同步可靠。群發前需對每位好友開啟聊天視窗。同樣原理:
TXGuiFoundation 或類似)。SysListView32 或自訂類別)。SendMessage(WM_LBUTTONDBLCLK) 或 NM_DBLCLK 通知)。QQSendMessage。| 項目 | 說明 |
|---|---|
| 適用 IM | 理論適用所有基於 Windows 訊息迴路的 IM (MSN、RTX、企業微信等),需依各軟體調整類別名稱/層級 |
| 版本敏感度 | 極高:QQ 版本升級常變更視窗類別、層級結構,需重新 Spy++ 更新代碼 |
| 權限需求 | 需與 QQ 同完整性層級執行 (UAC 影響);管理員模式下可能找不到使用者桌面視窗 |
| 反自動化 | 騰訊可能偵測高頻 SendMessage/ReplaceSel 封鎖帳號,建議加入隨機延遲、模擬真人輸入節奏 |
| Unicode 支援 | VC6 非原生 Unicode,中文訊息需確保專案字元集與目標控制項一致 (建議用 MultiByteToWideChar) |