免費 QQ 無群發功能,每次通知同事都要逐個點、逐個發。與其忍受廣告尾巴的第三方小工具,不如花 30 分鐘寫一個乾淨的自己的。核心思路:**模擬使用者在聊天視窗的鍵盤/滑鼠操作,利用 Windows 訊息機制自動化發送流程。**
RichEdit 控制項FindWindowEx 遍歷頂層視窗,比對標題關鍵字FindWindowEx 取得 RichEdit 控制代碼 → SetSel 移至尾端 → ReplaceSel 插入文字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); // 繼續找下一個視窗
}
}
思路相同,只需在外層迴圈:
QQSendMessage()注意:操作間需適當 Sleep(200~500) 避免訊息堵塞,並處理視窗狀態異常(如已最小化、被遮擋)。
此 **「尋找視窗 → 定位控制項 → 發送訊息/模擬點擊」** 模式適用於**所有基於 Windows 訊息迴路的 IM 軟體**(舊版 MSN、RTX、企業微信舊版等)。新版採用 DirectUI/Chrome Embedded Framework (CEF) 的客戶端則需改用 UI Automation 或無障礙介面 (IAccessible/MSAA)。
幾十行代碼,解決了每天重複勞動的痛點。這就是 Windows 訊息機制的魅力:**凡是畫在螢幕上的,終究逃不出訊息迴路的掌心**。掌握 Spy++、FindWindowEx、SendMessage 三板斧,你就擁有了「遙控」任何傳統 Win32 應用的能力。