









#pragma once
//class实现 qq发射类
class QQmsg
{
public:
QQmsg();
~QQmsg();
// static 创建class 入口
//面向对象最重要的概念就是类(Class)和实例(Instance)
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 sent_msg;
};

#include "stdafx.h"
#include "QQmsg.h"
QQmsg::QQmsg()
{
}
QQmsg::~QQmsg()
{
}
//入口函数 (开启 发射 的函数实现)
void QQmsg::Start(const wchar_t *msg)
{
sent_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 = sent_msg.GetLength() * sizeof(wchar_t) + 2;
HANDLE hHandle = GlobalAlloc(GHND, memLen);
void *addr = GlobalLock(hHandle);
ZeroMemory(addr, memLen);
memcpy(addr, (const wchar_t*)sent_msg.GetBuffer(), memLen);
GlobalUnlock(hHandle);
//
OpenClipboard(NULL);//打开剪切板
EmptyClipboard();//清空
SetClipboardData(CF_UNICODETEXT, hHandle);//设置剪切板内容
CloseClipboard();//
}



void CqqsentDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
QQmsg::Instance()->Start(sent_msg.GetBuffer());//m_msg.GetBuffer() 获取指针
}




- 好像不支持win7系统测试过(导入mfc.dll也没用)
- win10 可以正常使用 (待更改)