




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
自动发送QQ消息的原理分析及实现摘要: 本文以自动发送QQ消息的原理分析和实现为主线,重点论述了三种获得子窗口的方法和两种发送消息的方法。关键字:自动发送QQ消息,子窗口,VC+,消息一、QQ窗口分析 近来尾巴病毒,在网络上很是流行,我也常常收到网友们发到来的带尾巴的消息。国庆节闲来无事,就拿此病毒来消遣一下写一个类似的自动发送QQ消息的小程序。先让我们分析一下尾巴的发作情况:当用户打开一个消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发出去了。如果要实现这些功能必须获得QQ窗口“发送”按钮的句柄和文本框的句柄。在进行程序编写之前需要使用Spy+对QQ窗口进行分析,以了解QQ窗口各个子窗口之间的关系。Spy+是一个基于 Win32 的实用工具,它提供系统的进程、线程、窗口和窗口消息的图形视图。使用Spy+ 可以查看选定的窗口、线程、进程或消息的属性。 启动Spy+,并打开一个QQ窗口。在Spy+的“监视”菜单中选择“查找窗口”(如图1),就弹出如图2的窗口,然后选择“查找程序工具”,拖拉到QQ窗口的输入文本框上, 图1:选择查找窗口 图2:查找窗口单击确定,就弹出如图3的窗口。图3:窗口属性 在图3这个窗口中,我们可以对当前窗口的类别、父窗口和子窗口的继承关系等有关该窗口的信息。经分析,输入文本框是QQ窗口的第4个子窗口的第23个子窗口的第1个子窗口,这对我们程序的编写十分重要。采用同样的步骤,对“发送”按钮进行分析,得到:“发送”是QQ窗口的一个子窗口。在本文中为了示范作用,我们采用多种不同的方式获得子窗口。本程序是在VC+2003开发环境下编写的,可以正常运行。二、QQ窗口句柄的获取 窗口有两种,一种是消息模式,在这种情况下,窗口标题含有“发送消息”字样;一种是聊天模式,窗口标题含有“聊天中”字样。这些文字将成为我们寻找QQ窗口的线索。下面是获得QQ窗口的代码: CWnd *hCurrentWindow;CWnd *QQWnd; CString WndText;CString SendText;hCurrentWindow=(CDialog* )GetWindow(GW_HWNDFIRST);while(hCurrentWindow!=NULL)hCurrentWindow-GetWindowText(WndText);if(WndText.Find(聊天中)!=-1)|(WndText.Find(发送消息)!=-1)QQWnd=hCurrentWindow;break; else hCurrentWindow=hCurrentWindow-GetWindow(GW_HWNDNEXT); 在对代码进行解释之间,先对GetWindow(UNIT nCmd)进行简单的介绍。该函数返回与窗口有特定关系(如Z序或所有者)的窗口句柄。参数nCmd:说明指定窗口与要获得句柄的窗口之间的关系。该参数值可以是下列之一: GW_CHILD:如果指定窗口是父窗口,则获得的是在Z序顶端的子窗口的句柄,否则为NULL。函数仅检查指定父窗口的子窗口,不检查继承窗口。 GW_ENABLEDPOUP:(WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);如果无使能窗口,则获得的句柄与指定窗口相同。 GW_HWNDFIRST:返回的句柄标识了在Z序最高端的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在Z序最高端的顶层窗口:如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。 GW_HWNDLAST:返回的句柄标识了在Z序最低端的相同类型的窗口。如果指定窗口是最高端窗口,则该柄标识了在Z序最低端的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在Z序最低端的顶层窗口;如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。 GW_HWNDNEXT:返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。 GW HWNDPREV:返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。 GW_OWNER:返回的句柄标识了指定窗口的所有者窗口(如果存在)。 如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。在本段代码中我们用到了GW_HWNDFIRST和GW_HWNDNEXT这两个参数。该代码的思路是:首先获得最高端的窗口,然后获得其文本,判断其文本中是否包含“聊天中”或者“发送消息”,若包含,则找到QQ窗口;否则,转到下一个窗口。三、为文本框设置文本 在获得了QQ窗口的句柄之后,我们就可以依据前面的分析,进一步找到输入文本框的句柄,对文本进行设置。以下为获得QQ窗口输入文本框句柄的代码:HWND CQQTailDlg: MyChildWnd(HWND hwnd,int num) /查找第num个子窗口,hwnd/为父窗口HWND ChildWnd=0;for(int i=0;inum;i+)ChildWnd = :FindWindowEx(hwnd,ChildWnd,NULL,NULL);return ChildWnd;void CQQTailDlg: FindQQTextWnd(HWND hwnd) /查找输入文本框句柄HWND TempWnd;TempWnd=MyChildWnd(hwnd,4);TempWnd=MyChildWnd(TempWnd,23);TempWnd=MyChildWnd(TempWnd,1);TextWnd=TempWnd;在本段代码里,查找子窗口,没有用上面提到的GetWindow()函数,而是FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow)。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始,在查找时不区分大小写。下面对其参数进行介绍。hwndParent:要查找子窗口的父窗口句柄。如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。有前面的分析可知:输入文本框是QQ窗口的第4个子窗口的第23个子窗口的第1个子窗口,所以在FindQQTextWnd函数里出现了以下代码:TempWnd=MyChildWnd(hwnd,4);TempWnd=MyChildWnd(TempWnd,23);TempWnd=MyChildWnd(TempWnd,1);在获得了输入文本框句柄之后,就可以在文本框里设置你想发送的文本了。一般情况下可以向文本框发送WM_SETTEXT消息来实现,但是腾讯公司使用了一些技术,对文本框屏蔽了WM_SETTEXT消息。所以我们必须寻找其他的途径。功夫不负有心人,经过反复测试发现,WM_CHAR消息没有被腾讯公司屏蔽。因此,可以使用这个消息把字符发送到文本框。以下为设置文本代码:void CQQTailDlg:SetTextWndText(HWND hwnd,LPSTR pstr)/设置文本int len=:strlen(pstr);for(int i=0;im_hWnd,(WNDENUMPROC)EnumChildProc,0);以及该函数调用的回调函数EnumChildProc :BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)LPTSTR pstr;pstr= new TCHAR100;int len=GetWindowTextLength(hwnd);:GetWindowText(hwnd,pstr,len+1);char *p;p=strstr(pstr,发送);if(p&len1)SendWnd=hwnd;return TRUE; 在此段代码中我们使用了另外一种方式获得子窗口的句柄枚举子窗口,使用了EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam)函数。该函数可以枚举一个父窗口的所有子窗口。下面对其参数进行解释:hWndParent:父窗口句柄 lpEnumFunc: 回调函数的地址 lParam :自已定义的参数该函数直到最个一个子窗口被枚举或回调函数返回一个false,否则将一直枚举下去。EnumChildProc是一个回调函数,负责对每一个子窗口的操作。注意:此回调函数要么是类的静态函数,要么就是一个全局的函数。在本程序中将其设为全局函数。通过代码我们可以知道,在回调函数中,获取每一个子窗口的文本,判断其是否包含“发送”,若包含,则认为该子窗口为“发送”按钮。获取按钮句柄之后,就可以很方便的向该窗口发送消息,代码如下::SendMessage(SendWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);:SendMessage(SendWnd,WM_LBUTTONUP,0,0);这里我们用到了我们前面提到的SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam),该函数将指定的消息发送到一个或多个窗口。下面对其参数进行解释:hWnd:其窗口程序将接收消息的窗口的句柄。Msg:指定被发送的消息。wParam:指定附加的消息指定信息。IParam:指定附加的消息指定信息。该函数的返回值是指定消息处理的结果,依赖于所发送的消息。至此我们就完成了文本的自动发送。五、程序实现步骤 本程序是在VC+ 2003开发平台上开发而成的,是一个基于对话框的MFC应用程序。程序实现的具体步骤如下: (1)在VC+ 2003下新建一个名为QQTail的解决方案,在应用程序类型中,选择基于对话框。(2)使用对话框编辑器,将对话框设计为如图4所示的窗口。(3)为“开始”、“停止”和“关闭”按钮添加消息处理函数,为两个文本框分别添加变量。(4)将上面所述的各种代码分别写进相应的函数。下面将有详尽的代码。图4:交互界面详尽代码如下:void CQQTailDlg:OnBnClickedOk()/“开始”按钮代码this-UpdateData(true);pstr= new TCHAR100; m_text.GetWindowText(pstr,100);m_time=m_time*1000;this-SetTimer(1,m_time,NULL);/设置计时器void CQQTailDlg:OnBnClickedPause()/“停止”按钮代码this-KillTimer(1);/删除计时器void CQQTailDlg:QQTailStart()/该程序的核心函数,用于启动各个相关函数CString WndText;CString SendText;hCurrentWindow=(CDialog* )GetWindow(GW_HWNDFIRST);while(hCurrentWindow!=NULL)hCurrentWindow-GetWindowText(WndText);if(WndText.Find(聊天中)!=-1)|(WndText.Find(发送消息)!=-1)QQWnd=hCurrentWindow;break; else hCurrentWindow=hCurrentWindow-GetWindow(GW_HWNDNEXT); EnumChildWindows(QQWnd-m_hWnd,(WNDENUMPROC)EnumChildProc,0); FindQQTextWnd(QQWnd-m_hWnd);/获得文本框句柄SetTextWndText(TextWnd,pstr);/设置文本:SendMessage(SendWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);:SendMessage(SendWnd,WM_LBUTTONUP,0,0);void CQQTailDlg:OnTi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高三试卷:河北省邢台市质检联盟2024-2025学年高三上学期11月期中语文
- 试岗期间工作总结
- 幼儿园董事汇报
- 房屋建筑项目风险评估方案
- 城市生活污水集中处理设施建设方案
- 2025年国有企业中层管理人员笔试试题及答案
- 2025年度廉政知识测评考试题库(含答案)
- 皮肤管理营销周年庆方案
- 房贷营销方案设计论文
- 我国对外贸易高质量发展的战略路径研究
- 农村建房技术培训课件
- 红十字救护员培训理论试题及答案
- 2025年新能源电动摆渡车景区运营绿色出行解决方案报告
- 安全素养提升培训考试题及答案解析
- 动量守恒定律模型归纳(11大题型)(解析版)-2025学年新高二物理暑假专项提升(人教版)
- 2025股权转让合同签订股权认购协议书
- 某小区改造配电室(电力)工程监理大纲
- Z20+名校联盟(浙江省名校新高考研究联盟)2026届高三第一次联考化学及答案
- 医疗器械配送应急预案模板(3篇)
- DB65-T 4803-2024 冰川厚度测量技术规范
- 2025年新疆投资发展集团有限责任公司人员招聘笔试备考题库含答案详解(夺分金卷)
评论
0/150
提交评论