qq如何定时发消息给好友(C++实现定时给QQ好友发送消息)
一:方案思路
对于QQ窗口来说,使用程序发送程序时,可以先将要发送的消息复制到剪贴板,然后当要发送的QQ好友的窗口获得键盘焦点时,默认输入焦点在发送消息的输入框,所以可以定时将QQ好友窗口设置为前端窗口,然后模拟键盘按ctrl+v将要发送的数据粘贴到输入框中,然后模拟按alt +s 发送消息。 是不是很简单呢? 好吧,让我告诉你如何做。
二:编程
1、首先获取要发送QQ消息的好友的聊天框窗口句柄。 我们这里使用的操作方法有点类似于Visual Studio自带的spy++获取窗口句柄的方式。 他们都在十字标记位置按下鼠标。 然后在指定窗口上释放鼠标即可获取该窗口的句子
处理了。
(1). 这里为了达到spy++的效果,我们需要用到一个函数SetCapture。 函数使用说明如下:
HWND 设置捕获(
HWND hWnd // 捕获全局鼠标消息的控件句柄
);
由于带有十字标记的pic控件的大小是有限的,如果鼠标在按下状态下移出pic控件,那么就没有办法继续跟踪鼠标抬起消息。 这个SetCapture函数的作用就是从这一刻开始,不管鼠标有什么消息。 该消息必须发送到我的控件,而不是发送到其他控件,这样鼠标移出此控件后才能继续鼠标抬起的消息。 这样就可以设置程序在鼠标抬起时检测这里的窗口句柄了(具体代码实现如下所述)
(2)。 但如果不断地向该控件发送鼠标消息是非常危险的。 如果其他控件无法接收鼠标消息,就相当于电脑鼠标出现故障。 只有单击该控件才有用。 因此,在 SetCapture 之后,在适当的时候释放鼠标,以便鼠标可以向其他控件发送消息。 这时就需要使用ReleaseCapture在鼠标抬起时及时释放鼠标消息。 该函数的使用方法如下:
BOOL 释放捕获(VOID);
//-------------------------图片十字标记控制鼠标按下代码参考--------- -----------------
//这个函数处理的是那个十字标的pic控件被鼠标按下产生的事件
void picCross_MouseDown(int button, int shift, int x, int y)
{
//当用户在这个里面点击鼠标的时候,自动把鼠标变为十字标
//此代码由老师提供,大家可以在我的程序的具体内容中探究具体的实现方式
pApp->MousePointerGlobalSet(IDC_Cross);
//捕获全部的鼠标事件
SetCapture(form1.Control(ID_picCross).hWnd());
}
(3)。 这里我们使用 WindowFromPoint API 函数在鼠标抬起时获取特定好友的窗口句柄。 以下是该功能的使用说明:
HWND 窗口从点(
POINT Point // 这是一个鼠标位置的结构体
);
然后返回的是当前鼠标位置的窗口句柄。 为了获取当前鼠标位置,我们可以使用GetCursorPos函数来获取鼠标位置(注:这里的位置是相对于整个电脑屏幕的绝对坐标),函数用法:
BOOL 获取光标位置(
LPPOINT lpPoint // 指向鼠标位置结构体的指针
);
//---------------------------------鼠标抬起搜索窗口参考代码-------- -----------------------
//这个是pic十字标控件鼠标抬起的消息处理函数
void picCross_MouseUp(int button, int shift, int x, int y)
{
//如果用户的鼠标抬起,那么开始监测这个位置有没有要监测的窗口内容
//首先恢复鼠标的显示
pApp->MousePointerGlobalSet(IDC_Arrow);
TCHAR sWindText[64]={0};
//寻找鼠标位置,找到窗口句柄
POINT pPont;
GetCursorPos(&pPont);
m_hWndQQSend=WindowFromPoint(pPont);
GetWindowText(m_hWndQQSend, sWindText,sizeof(sWindText));
m_sWindName =sWindText;
//然后在那个编辑框显示找到的窗口的句柄
//此代码由老师提供,大家可以在我的程序的具体内容中探究具体的实现方式
form1.Control(ID_txtHwndFind).TextSet(Str((int)m_hWndQQSend));
form1.Control(ID_txtWindName).TextSet(sWindText);
//释放鼠标
ReleaseCapture();
}
到这里你已经实现了最基本的搜索窗口功能。 现在我们来看看效果。
2.找到窗口后,下一步就是使用虚拟按键。
对于发送虚拟按键的具体使用,我们将所有代码放在发送按钮的点击事件中统一编写。
(1). 在按下虚拟键之前,我们需要将要发送的窗口放到前面并正常显示。 这里我们使用两个函数:SetForegroundWindow 和 ShowWindow。 具体用法如下:
BOOL 设置前景窗口(
HWND hWnd // 要放置在前面的窗口句柄
);
BOOL 显示窗口(
HWND hWnd, // 窗口句柄
int nCmdShow //窗口显示状态
);
ShowWindow函数的第二个参数的详细信息可以在MSDN上找到。 这篇博文就不详细介绍了。 这里使用的是SW_SHOW(正常显示)。
(2)。 虚拟按键的实现只需要一个按键,即keybd_event函数,它可以模拟所有键盘动作。 具体用法如下:
无效 keybd_event(
BYTE bVk, // 虚拟键码
BYTE bScan, // 不用担心,只需将其设置为 0
DWORD dwFlags, // 设置虚拟按钮的按下或抬起状态
DWORD dwExtraInfo // 不用担心,只需将其设置为 0
);
注意虚拟按键功能的使用规范:首先,按键按下过程完成后必须有一个抬起动作。 其次,功能执行速度比较快。 如果要使用虚拟按钮,最好在中间添加Sleep功能。 让程序等待一段时间,否则虚拟按键很容易因为代码执行速度太快而失效。
void cmdSend_Click()
{
//发送消息框里面的信息
//具体实现,将内容复制到剪切板,然后模拟按键实现发送
tstring sText = form1.Control(ID_txtSend).Text();
//==========================准备工作===============================
if (sText == TEXT(""))
{
MsgBox(TEXT("请输入您要发送的信息不能为空!"), TEXT("发送消息为空"),mb_OK, mb_IconInformation);
timSend.EnnabledSet(false);
}
else if (m_hWndQQSend == NULL)
{
MsgBox(TEXT("还没有选定待发送消息的窗口,请选择聊天窗口!"), TEXT("窗口句柄为空"),mb_OK, mb_IconInformation);
timSend.EnnabledSet(false);
}
else
{
//首先还应该判断窗口是否已经关闭,如果关闭,不再进行下面的发送操作
//设置窗口最前端
if (!SetForegroundWindow(m_hWndQQSend))
{
MsgBox(TEXT("该窗口被关闭,无法发送消息到指定窗口!"),TEXT("请检查该窗口是否被关闭"),mb_OK,mb_IconQuestion);
m_hWndQQSend = NULL;
form1.Control(ID_txtHwndFind).TextSet(TEXT(""));
return;
}
//===========================================================
//=====================核心代码==============================
//这里还要让窗口正常显示,否则也不行
ShowWindow(m_hWndQQSend, SW_NORMAL);
//复制文本到剪切板
//此代码由老师提供,大家可以在我的程序的具体内容中探究具体的实现方式
ClipboardSetText(sText);
//首先模拟 ctrl+v 的按键输入内容,然后进行发送操作
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY|0, 0);
keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY|0, 0);
Sleep(10);//需有一定的间隔时间
keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
//此处还是给用户一个自己设定的空间,毕竟不同的窗口的快捷键可能不同
Sleep(10);//需有一定的间隔时间
keybd_event(18, 0, KEYEVENTF_EXTENDEDKEY|0, 0);
keybd_event(83, 0, KEYEVENTF_EXTENDEDKEY|0, 0);
Sleep(10);//需有一定的间隔时间
keybd_event(83, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
keybd_event(18, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
//清空内容的显示
form1.Control(ID_txtSend).TextSet(TEXT(""));
}
恭喜您,现在您可以通过该程序发送QQ消息,而无需操作QQ窗口了。 是不是很神奇? 让我们来看看!
3、定时功能和左侧列表的实现
定时功能主要是通过Windows提供的定时器API函数来实现的。 主要实现函数是SetTimer和KillTimer。 SetTimer用于创建定时器,而KillTimer主要用于删除定时器。 具体代码实现本篇博客这里就不过多介绍了。 这个程序的源码已经将内容封装到了CBTimer类中。 如果有兴趣,可以下载源码看看具体的实现过程。
4. 小贴士
该程序还具有一些开发功能,比如循环发送,也就是俗称的消息轰炸。 用户只需修改部分源码即可控制循环发送的内容。 该程序暂时不实现左侧列表管理,即只能由一个程序定时。 发送一条消息时,如果要发送多条消息,需要等待一条消息发送完毕后,再自定义下一条消息的发送时机。 欢迎大家对源码提出建议,如果有兴趣继续,可以添加一些更高端的功能。 。