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

VC++ 實現 QQ 訊息群發:基於 Windows 訊息迴路的 UI 自動化實戰

     編輯:VC 教學

前言

免費 QQ 無群發功能,每次通知同事都要逐個點、逐個發。與其忍受廣告尾巴的第三方小工具,不如花 30 分鐘寫一個乾淨的自己的。核心思路:**模擬使用者在聊天視窗的鍵盤/滑鼠操作,利用 Windows 訊息機制自動化發送流程。**

目標視窗結構分析 (Spy++ 觀察)

  • 聊天主視窗:標題含「聊天中」
  • 輸入區:巢狀視窗 → RichEdit 控制項
  • 發送按鈕:標題為「發送」的子視窗

三步走自動化邏輯

  1. 尋找聊天主視窗:FindWindowEx 遍歷頂層視窗,比對標題關鍵字
  2. 定位 RichEdit 並填入內容:層層 FindWindowEx 取得 RichEdit 控制代碼 → SetSel 移至尾端 → ReplaceSel 插入文字
  3. 模擬點擊發送:枚舉主視窗子控制項,找到標題含「發送」者 → SendMessage(BM_CLICK)

核心代碼完整版


void CMySMSDlg::QQSendMessage()
{
    CString str;
    CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);

    while (pMainWnd) {
        HWND hWnd = pMainWnd->m_hWnd;
        pMainWnd->GetWindowText(str);

        if (str.Find(_T("聊天")) > -1) {           // 1. 找到聊天主視窗
            // 2. 穿透巢狀視窗找 RichEdit
            hWnd = FindWindowEx(pMainWnd->m_hWnd, NULL, _T("#32770"), NULL);
            CWnd* pChild = CWnd::FromHandle(hWnd);
            hWnd = FindWindowEx(pChild->m_hWnd, NULL, _T("AfxWnd42"), NULL);
            pChild = CWnd::FromHandle(hWnd);
            HWND hRich = FindWindowEx(pChild->m_hWnd, NULL, _T("RICHEDIT"), NULL);

            if (hRich) {
                CRichEditCtrl* pRich = (CRichEditCtrl*)CWnd::FromHandle(hRich);
                int nLen = pRich->GetWindowTextLength();
                pRich->SetSel(nLen, nLen);
                pRich->ReplaceSel(_T("【自動通知】今晚 8 點開會,請準時參加!"));
            }

            // 3. 找發送按鈕並點擊
            hWnd = FindWindowEx(pMainWnd->m_hWnd, NULL, NULL, NULL);
            while (hWnd) {
                CWnd* pBtn = CWnd::FromHandle(hWnd);
                pBtn->GetWindowText(str);
                if (str.Find(_T("發送")) > -1) {
                    pBtn->SendMessage(BM_CLICK);
                    return;  // 發送完成直接返回
                }
                hWnd = FindWindowEx(pMainWnd->m_hWnd, hWnd, NULL, NULL);
            }
            return;
        }
        pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT); // 繼續找下一個視窗
    }
}

進階擴充:批量發送給多位好友

思路相同,只需在外層迴圈:

  1. 取得好友清單視窗句柄
  2. 遍歷好友項目,模擬雙擊打開聊天視窗
  3. 呼叫上述 QQSendMessage()
  4. 關閉聊天視窗,處理下一位

注意:操作間需適當 Sleep(200~500) 避免訊息堵塞,並處理視窗狀態異常(如已最小化、被遮擋)。

通用性說明

此 **「尋找視窗 → 定位控制項 → 發送訊息/模擬點擊」** 模式適用於**所有基於 Windows 訊息迴路的 IM 軟體**(舊版 MSN、RTX、企業微信舊版等)。新版採用 DirectUI/Chrome Embedded Framework (CEF) 的客戶端則需改用 UI Automation 或無障礙介面 (IAccessible/MSAA)。

安全與合規提醒

  • 僅供個人學習、內部辦公自動化使用
  • 嚴禁用於垃圾訊息散播、營銷騷擾、帳號盜取等違法行為
  • 騰訊伺服器有風控機制,高頻發送會導致帳號限制甚至封禁,**請控制頻率(建議 >5 秒/條)**

結語

幾十行代碼,解決了每天重複勞動的痛點。這就是 Windows 訊息機制的魅力:**凡是畫在螢幕上的,終究逃不出訊息迴路的掌心**。掌握 Spy++、FindWindowEx、SendMessage 三板斧,你就擁有了「遙控」任何傳統 Win32 應用的能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved