首页 > 常识 >

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. 小贴士

该程序还具有一些开发功能,比如循环发送,也就是俗称的消息轰炸。 用户只需修改部分源码即可控制循环发送的内容。 该程序暂时不实现左侧列表管理,即只能由一个程序定时。 发送一条消息时,如果要发送多条消息,需要等待一条消息发送完毕后,再自定义下一条消息的发送时机。 欢迎大家对源码提出建议,如果有兴趣继续,可以添加一些更高端的功能。 。