Visual C++模拟QQ尾巴功能
C++ #vc++ #qq尾巴2012-11-22 00:19
基本原理如下:
因为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消息 http://yige.org { 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尾巴内容是在代码中写死的,完全可以做到自定义。
因为只是简单的使用了钩子,所以会遭到杀毒工具的警告。
相关文章
- 说说C++头文件包含 2012/11/22
- Visual C++学习方法及书籍推荐 2012/11/22
- C++静态数据成员的作用和好处 2012/11/21
- C++模拟内存管理程序 2012/11/21
- C++笔试题 2012/11/21
- C++实现的支持中文的键盘记录工具 2012/11/14
- C++引用和指针的选择 2012/11/14
- C++中MessageBox()的用法 2012/11/14
- 说说C++中的引用和指针 2012/11/14
- 说说C++虚函数 2012/11/13