首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Visual C++ 模擬鍵鼠實現 QQ 訊息群發:視窗尋找、RichEdit 寫入與按鈕點擊自動化

     編輯:關於VC++

需求:免費 QQ 用戶無群發功能,手動逐個發送極其繁瑣。利用 Windows 訊息機制,模擬使用者操作:尋找聊天視窗 → 定位輸入框 → 寫入文字 → 點擊發送按鈕。本文提供完整 VC6 MFC 實作碼 (約 20KB),適用 QQ 2004 SP1 / Win2000 SP4。

自動化核心流程

  1. 尋找主聊天視窗:標題含「聊天中」,FindWindowEx 遍歷頂層視窗。
  2. 定位輸入框:Spy++ 觀察層級結構 → #32770 (對話框) → AfxWnd42 (MFC 視圖) → RICHEDIT (富文本編輯控制項)。
  3. 寫入訊息:取得 CRichEditCtrl* 指標,SetSel 移至末尾 → ReplaceSel 插入文字。
  4. 點擊發送:遍歷主視窗子控制項,尋找標題含「發送」的按鈕 → 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 同步可靠。
  • Spy++ 不可或缺 — 必須先用 Spy++ 觀察目標視窗類別名稱、層級結構,類別名稱隨 QQ 版本變動極大。

擴充:自動開啟聊天視窗

群發前需對每位好友開啟聊天視窗。同樣原理:

  1. 尋找 QQ 主面板視窗 (類別名 TXGuiFoundation 或類似)。
  2. 定位好友列表控制項 (通常為 SysListView32 或自訂類別)。
  3. 模擬雙擊好友項目 (SendMessage(WM_LBUTTONDBLCLK) 或 NM_DBLCLK 通知)。
  4. 等待聊天視窗彈出 → 呼叫上述 QQSendMessage。

適用性與限制

現代替代方案

  • UI Automation (UIA):Windows 7+ 內建,支援跨進程控制項操作,比訊息模擬穩健。
  • 官方 Open API:騰訊開放平台提供 Bot API、群發介面 (需認證、付費)。
  • Hook/DLL 注入:直接在目標進程內呼叫內部發送函數,極不穩定且易被殺毒攔截。

總結

訊息模擬是 Windows 桌面自動化最基礎也最通用的技術。本文以 QQ 群發為例,展示 FindWindowEx 視窗尋找、CRichEditCtrl 文字注入、BM_CLICK 按鈕觸發的完整鏈路。**核心難點不在代碼,而在 Spy++ 觀察與版本適配維護**。實務專案建議封裝為「視窗操作助手類別」,隔離版本差異,並加入重試、日誌、異常恢復機制。完整 Demo 專案請下載附件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目說明
適用 IM理論適用所有基於 Windows 訊息迴路的 IM (MSN、RTX、企業微信等),需依各軟體調整類別名稱/層級
版本敏感度極高:QQ 版本升級常變更視窗類別、層級結構,需重新 Spy++ 更新代碼
權限需求需與 QQ 同完整性層級執行 (UAC 影響);管理員模式下可能找不到使用者桌面視窗
反自動化騰訊可能偵測高頻 SendMessage/ReplaceSel 封鎖帳號,建議加入隨機延遲、模擬真人輸入節奏
Unicode 支援VC6 非原生 Unicode,中文訊息需確保專案字元集與目標控制項一致 (建議用 MultiByteToWideChar)