”QQ尾巴“功能模拟

最近又开始学习windows hook技术了,看到“QQ尾巴”有点意思, 所以就利用hook简单的实现了一下。


基本原理如下:

因为QQ消息大都是通过回车键回车键加其他键的组合键来发送的,所以只要利用键盘钩子钩住系统中的回车键的WM_KEYDOWN消息即可。

检测到回车键按下时,

首先检测当前拥有输入焦点的窗口是否是QQ聊天窗口,这里对QQ聊天窗口的判断是,检查窗口类名是否是“TXGuiFoundation”(这个值通过spy++获取的)。

然后将“QQ尾巴”内容设置到windows剪切板中。

然后模拟点击 ctrl + V ,将剪切板中的内容粘贴到当前拥有焦点的窗口(QQ聊天窗口)中。

最后继续回车键按下的消息处理。


原理很简单, 下面是部分代码实现:

LRESULT CALLBACK CMainWnd::KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam) // 钩子处理函数
{
	if(nCode >= 0)
	{
		if(UINT(wParam) == WM_KEYDOWN) // 判断是否为WM_KEYDOWN消息

		{
			PKBDLLHOOKSTRUCT paramer = (PKBDLLHOOKSTRUCT)lParam;

			if(m_f2down && paramer->vkCode == VK_RETURN) // 判断是否按下回车键(这里把F2键设置成QQ尾巴的开关键)
			{
				// 获取用于焦点的创建句柄
				const DWORD tid = ::GetWindowThreadProcessId(GetForegroundWindow(),NULL);
				::AttachThreadInput(tid, GetCurrentThreadId(),TRUE);
				CBaseWnd * pWndFocus = CBaseWnd::FromHandle(::GetFocus());
				if(pWndFocus != NULL)
				{
					if(*(pWndFocus->GetClsName()) == TEXT("TXGuiFoundation")) // 检测是否是QQ聊天窗口
					{
						// 在剪切板中填充自己的信息
						CClipboard cli;
						cli.Open(pWndFocus);
						LPCTSTR lpt = cli.ReadText(); // 保存剪切板原来的值
						cli.Clear(); // 清空剪切板
		cli.WriteText(TEXT("\r\n\r\n(本消息由该成员通过iphone4 for qq发送,体验手机QQ请登录:http://mobile.qq.com) \r\n"));
						
						cli.Close();  // 这里必须关闭剪切板,不然下面就无法向指定的窗口发送粘贴消息了

						// 发送粘贴键盘消息
						CKMInput kmInput;
						kmInput.Key_Two_Higher(VK_CONTROL, 'V', 10);// 发送ctrl + v

						cli.Open(pWndFocus);
						cli.Clear();
						cli.WriteText(lpt); // 恢复剪切板中值
						cli.Close();
					}
				}
			}

			if(paramer->vkCode == VK_F2) // 按下F2键,打开或关闭QQ尾巴开关
				m_f2down = !m_f2down;



			
		}
	}
	
	return ::CallNextHookEx(hookKey.GetHook(), nCode, wParam, lParam); // 处理完成后,继续消息的传递
}


实际效果如图:

在每次单击回车键时,都会在聊天内容下面添加一个自己的尾巴。


遗留问题:

为了简单,这里没有处理点击发送按钮发送消息的情况。其实这种情况也一样可以通过钩子来解决。

还有一点是,QQ尾巴内容是在代码中写死的,完全可以做到自定义。

因为只是简单的使用了钩子,所以会遭到杀毒工具的警告。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值