美文网首页
C++实战QQ消息群发器

C++实战QQ消息群发器

作者: 十年之后_b94a | 来源:发表于2019-12-06 18:00 被阅读0次

创建项目空项目

//main.cpp
#include <iostream>
#include "sendQQ.h"
using namespace std;

int main()
{
    sendQQ *test = new sendQQ();
    char str[2084] = "";
    cout << "请输入你要发送的内容:"<<endl;
    cin >> str;
    test->setCut((char *)str,MAXBYTE);
    test->InitStart();
    delete test;//删除指针
    system("pause");
    return 0;
}

新建sendQQ类

#pragma once
#include <Windows.h>
#include <vector>
using namespace std;

class sendQQ
{
private:
    int test = 10;
    HANDLE WindowObj;
    CHAR className[MAXBYTE];
    CHAR HandTtitle[MAXBYTE];
    vector<HWND> isQHwndArr;//当前所有qq消息框的句柄
    static BOOL CALLBACK enumList(HWND, LPARAM);//查找所有进程句柄
public:
    sendQQ();
    ~sendQQ();
    void setCut(char *,DWORD len);//设置剪切板内容
    void InitStart();//开始发送消息
    void getEmun();//查找所有进程句柄
    void actWindow(HWND);//激活窗口
};

sendQQ实现

#include <iostream>
#include "sendQQ.h"
#include <process.h>
using namespace std;

sendQQ::sendQQ()
{
}


sendQQ::~sendQQ()
{
}

void sendQQ::setCut(char * str, DWORD len)
{//设置剪切板
    GlobalUnlock(this->WindowObj);//释放锁定的内存
    GlobalFree(this->WindowObj);//释放对象内存
    if (OpenClipboard(NULL)) //打开剪切板
    {
        EmptyClipboard(); //清空剪切板原有的内容
        this->WindowObj = GlobalAlloc(GMEM_MOVEABLE, len);//分配内存空间,调用的内核层
        if (this->WindowObj)
        {
            char *pGlobal = (char*)GlobalLock(this->WindowObj); // 锁定并获取它的指针
            memcpy(pGlobal, str, len);
            SetClipboardData(CF_TEXT, this->WindowObj);
        }
        CloseClipboard();
    }
}

BOOL CALLBACK sendQQ::enumList(HWND Hwnd, LPARAM obj)
{
    GetClassName(Hwnd,((sendQQ * )obj)->className,MAXBYTE); //获取类名
    GetWindowText(Hwnd, ((sendQQ *)obj)->HandTtitle,MAXBYTE); //获取窗口标题
    if (strstr(((sendQQ *)obj)->className, (char *)"TXGuiFoundation") //确保类名与窗口类名一致
        && !strstr(((sendQQ *)obj)->HandTtitle,"QQ") //不找QQ的程序
        && !strstr(((sendQQ *)obj)->HandTtitle, "TXMenuWindow") //不差找QQ的主菜单
        && !strstr(((sendQQ *)obj)->HandTtitle,"迷你版") //不找QQ新闻的窗口
        && strcmp(((sendQQ *)obj)->HandTtitle,"")
        )
    {
        printf("窗口类名:%d|窗口标题:%s\r\n", ((sendQQ *)obj)->className, ((sendQQ *)obj)->HandTtitle);
        ((sendQQ *)obj)->isQHwndArr.push_back(Hwnd); //如果是QQ消息框的 把句柄填进去
    }

    return true;
}

void sendQQ::getEmun()
{//获取当前QQ消息列表的窗口句柄
    EnumWindows(this->enumList,(DWORD)this);
    vector<HWND>::iterator it;
    for (it = this->isQHwndArr.begin();it != this->isQHwndArr.end();++it)
    {
        this->actWindow((HWND)*it);
        SendMessage((HWND)*it, WM_PASTE, 0, 0);
        keybd_event(VK_RETURN,MapVirtualKey(VK_RETURN,0),0,0); //按下回车
        Sleep(50);
        keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), KEYEVENTF_KEYUP, 0); //弹起回车
    }
}


void sendQQ::actWindow(HWND hwnd)
{//激活窗口
    DWORD dwTime = -1;
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,(LPVOID) &dwTime,0);
    if(dwTime>=100)
    {
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0,0, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
    }
    HWND nowWind = GetForegroundWindow();//获取当前窗口的句柄
    SetWindowPos(nowWind,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE); //设置窗口禁止移动禁止改变大小
    DWORD onId = GetCurrentProcessId();
    DWORD processID = GetWindowThreadProcessId(nowWind,NULL);
    AttachThreadInput(onId, processID,TRUE);//链接线程
    ShowWindow(hwnd,SW_SHOWNORMAL); //最小化回复
    SetForegroundWindow(hwnd); //恢复
    AttachThreadInput(onId, processID, FALSE);//释放连接
}

void sendQQ::InitStart()
{//开始发送消息
    this->getEmun();
}

相关文章

网友评论

      本文标题:C++实战QQ消息群发器

      本文链接:https://www.haomeiwen.com/subject/tfiegctx.html