创建项目空项目
//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();
}
网友评论