本帖最后由 爱学习的小仙女 于 2018-3-6 14:12 编辑
写在前面的话:
过年的时候QQ里各种群发祝福不断,这种群发消息只能在节假日的时候才会出现。日常生活中,在需要用到群发功能的时候,还需要借助其他软件来实现群发。今天:在这里简单写一个实现QQ群发功能的软件(通过模拟按键来实现消息的群发)
准备:
开发工具:VC,vs系列,等等···· 都可以(我用的是vs2015)
百度:函数keybd_event的功能和用法。
一、设计界面1.新建项目:选择MFC应用程序,选择保存位置
1.1
1.2
2.下一步:勾选<基于对话框>,取消勾选:安全开发生命周期检查。然后直接点击完成。
3:这就是一个建立好的MFC应用程序了,可以直接运行下看看效果
4.选中控件,按下键盘上的删除<Delete>,控件就不见了。
5.选择控件,输入:开始发送(或者右击,属性,改变文字)
6.选择工具箱,找到Edit控件,在对话框上拖动显示出来..
7.添加其他的控件,设置对话框界面。最终界面效果:
8.编辑框右击,添加变量:m_msg
添加成功后
二、设计程序1.添加类 QQMsg
2. 在QQMsg里写入下列代码
[Asm] 纯文本查看 复制代码 #pragma once
//这个类是实现QQ群发的类
class QQMsg
{
public:
QQMsg();
~QQMsg();
//static 创建一个类的入口
static QQMsg *Instance() {
static QQMsg object;
return &object;
}
//入口函数(开启群发的函数实现)
void Start(const wchar_t *msg);//const 群发的消息,一般不改变
private:
//线程函数
static unsigned int WINAPI RunThreadProc(void *param);
//发送主函数
void SendMain();
//模拟键盘函数
void PressKey(BYTE vkey);//
//发送消息
void SendMsg();
//把文字拷贝到剪切板
void CopyTextToClipborad();
private:
CString m_Msg;
};
3.在QQMsg.cpp中实现代码
[Asm] 纯文本查看 复制代码 #include "stdafx.h"
#include "QQMsg.h"
QQMsg::QQMsg()
{
}
QQMsg::~QQMsg()
{
}
//入口函数(开启群发的函数实现)
void QQMsg::Start(const wchar_t *msg)
{
m_Msg=CString(msg);
//开始线程
_beginthreadex(NULL, 0, QQMsg::RunThreadProc, NULL, 0, NULL);
}
//线程函数
unsigned int QQMsg::RunThreadProc(void *param)
{
QQMsg::Instance()->SendMain();
return 0;
}
//发送主函数
void QQMsg::SendMain()
{
int errtimes = 0;
//实现整个发送消息的流程
//复制文字到剪切板
CopyTextToClipborad();
////int i;
while (errtimes<=4)
{
//2.找到QQ窗口
HWND hQQWnd = FindWindow(L"TXGuiFoundation",L"QQ");
//windows系统中窗口的查找.1.窗口类名称.2.标题
//工具 --> spy++
//找到一个最前的窗口
HWND hfront = GetForegroundWindow();
if (hQQWnd!= hfront)
{
if (!SetForegroundWindow(hQQWnd))//强制把QQ窗口置顶
{
MessageBox(NULL,L"找不到QQ窗口",L"警告",MB_OK);
break;
}
}
////模拟按键 keybd_event函数
if (errtimes == 0)
{//使用循环这里会出问题
// i = 6;
// while (i--)
// {
// PressKey(VK_TAB);
// }
//按下6次TAB键
PressKey(VK_TAB);
PressKey(VK_TAB);
PressKey(VK_TAB);
PressKey(VK_TAB);
PressKey(VK_TAB);
PressKey(VK_TAB);
}
PressKey(VK_DOWN);
PressKey(VK_RETURN);
HWND hcurfrontWnd = GetForegroundWindow();
if (hcurfrontWnd == hQQWnd)
{
errtimes++;
continue;
}
errtimes = 0;
SendMsg();
}
}
//模拟键盘函数
void QQMsg::PressKey(BYTE vkey)
{
//模拟按键 keybd_event函数
keybd_event(vkey,0,0,0);
Sleep(100);//时间间隔100ms
keybd_event(vkey,0,KEYEVENTF_KEYUP,0);
Sleep(100);
}
//发送消息
void QQMsg::SendMsg()
{
//ctrl+v
keybd_event(VK_CONTROL, 0, 0, 0);
Sleep(100);
keybd_event(0x56, 0, 0, 0);
Sleep(100);
keybd_event(0x56, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
PressKey(VK_RETURN);//enter
PressKey(VK_ESCAPE);//Esc 关闭
}
//把文字拷贝到剪切板
void QQMsg::CopyTextToClipborad()
{
//全局内存中找一内存来存放字符串
int memLen = m_Msg.GetLength() * sizeof(wchar_t) + 2;
HANDLE hHandle = GlobalAlloc(GHND, memLen);
void *addr = GlobalLock(hHandle);
ZeroMemory(addr, memLen);
memcpy(addr, (const wchar_t*)m_Msg.GetBuffer(), memLen);
GlobalUnlock(hHandle);
//
OpenClipboard(NULL);//打开剪切板
EmptyClipboard();//清空
SetClipboardData(CF_UNICODETEXT, hHandle);//设置剪切板内容
CloseClipboard();//
}
3.返回对话框,双击开始发送按钮
3.将代码改为下列(并在此文件头中包含#include "QQMsg.h"):
[Asm] 纯文本查看 复制代码 UpdateData(true);
QQMsg::Instance()->Start(m_msg.GetBuffer());//m_msg.GetBuffer() 获取指针
三、编译
end |