《数字媒体技术与应用》课程考核报告学生姓名:夏小珍学号:2012214466班级:1301203学院:软件工程学院专业:软件工程报告的体系结构、立意(20分)类似自动发送QQ消息功能的技术研究背景、目的(20分)网上QQ尾巴病毒很多,自己也遭到迫害,所以想了解其中的原理及实现原理、方法(40分)Spy++、文本框的句柄、“发送”按钮的句柄实验结果、结论(20分)实现了自动发送消息学生成绩:教师(签名):考试日期:2015年05月20日14:00时至16:00时自动发送消息的设计与实现夏小珍(重庆邮电大学软件工程学院重庆400065)摘要:QQ聊天工具不仅实现了人们之间的即时聊天,还进一步加强了人与人之间的联系,当你在线时,而人不在设备附近,可以设置自动回复,这样就可以及时回答别人。但是现在很多QQ尾巴病毒恶意发送一些消息给别人,造成人们的反感和无奈。当用户打开一个QQ消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发送出去了。如果要实现这些功能必须获得QQ窗口“发送”按钮的句柄和文本框的句柄。关键词:QQ、自动发送、窗口、句柄、文本框TheDesignAndImplementationOfAutomaticSendingMessagesXiaXiaozhen(SchoolofSoftwareEngineering,ChongqingUniversityofPosts&Telecommunications,Chongqing400065,China)Abstract:QQQQcchhaattttoooollssnnoottoonnllyyrreeaalliizzeeddtthheeiinnssttaannttmmeessssaaggiinnggbbeettwweeeennppeeooppllee,,aannddaallssoossttrreennggtthheenntthheeccoonnttaaccttbbeettwweeeennppeeooppllee,,wwhheennyyoouuaarreeoonnlliinnee,,aannddnneeaarroouuttoofftthheeeeqquuiippmmeenntt,,yyoouuccaannsseetttthheeaauuttoorreeppllyy,,ssootthhaattyyoouuccaannaannsswweerriinnaattiimmeellyymmaannnneerr..BBuuttnnoowwaalloottooffQQQQttaaiillvviirruussmmaalliicciioouussttoosseennddssoommeemmeessssaaggeettooootthheerrss,,ccaauusseeppeeooppllee''ssaavveerrssiioonnaannddhheellpplleessss..MMeessssaaggeeiisssseennttwwhheenntthheeuusseerrooppeennssaaQQQQwwiinnddooww,,tthheevviirruusswwiillllaauuttoommaattiiccaallllyyeenntteerrtteexxttiinnttootthheemmeessssaaggeetteexxttbbooxx,,aannddtthheennsseennddoouuttwwiitthhoouuttwwaaiittiinnggffoorraauusseerrttoorreeaacctt..IIffyyoouuwwaannttttooaacchhiieevveetthheesseeffuunnccttiioonnssmmuussttbbeeQQQQwwiinnddoowwhhaannddlleettootthheesseennddbbuuttttoonnaannddtthheetteexxttffrraammee''sshhaannddllee..Keywords:QQ,automaticallysend,window,handle,textboxes1引言近来QQ尾巴病毒,在网上很是流行,人们常常收到网友们发到来的带尾巴的消息。当用户打开一个QQ消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发送出去了,如果要实现这些功能必须获得QQ窗口“发送”按钮的句柄和文本框的句柄。2QQ窗口分析在进行程序编写之前需要使用Spy++软件对QQ窗口进行分析,以及了解QQ窗口各个子窗口之间的关系。启动Spy++,打开一个QQ窗口。在Spy++的“监视”菜单中选择“查找窗口”,就弹出如图的窗口,然后选择“查找程序工具”,拖到QQ窗口的输入文本框上。单击确定,就弹出如图3的窗口在图3这个窗口中,我们可以对当前窗口的类别、父窗口和子窗口的继承关系等有关该窗口的信息。经分析,输入文本框是QQ窗口的第4个子窗口的第23个子窗口的第1个子窗口,这对我们程序的编写十分重要。采用同样的步骤,对“发送”按钮进行分析,得到:“发送”是QQ窗口的一个子窗口。3、QQ窗口句柄的获取QQ窗口有两种,一种是消息模式,在这种情况下,窗口标题含有“发送消息”字样;一种是聊天模式,窗口标题含有“聊天中”字样。这些文字将成为我们寻找QQ窗口的线索。下面是获得QQ窗口的代码:CWnd*hCurrentWindow;CWnd*QQWnd;CStringWndText;CStringSendText;hCurrentWindow=(CDialog*)GetWindow(GW_HWNDFIRST);while(hCurrentWindow!=NULL){hCurrentWindow-GetWindowText(WndText);if((WndText.Find(聊天中)!=-1)||(WndText.Find(发送消息)!=-1)){QQWnd=hCurrentWindow;break;}elsehCurrentWindow=hCurrentWindow-GetWindow(GW_HWNDNEXT);}在本段代码中我们用到了GW_HWNDFIRST和GW_HWNDNEXT这两个参数。该代码的思路是:首先获得最高端的窗口,然后获得其文本,判断其文本中是否包含“聊天中”或者“发送消息”,若包含,则找到QQ窗口;否则,转到下一个窗口。4、文本框设置文本在获得了QQ窗口的句柄之后,我们就可以依据前面的分析,进一步找到输入文本框的句柄,对文本进行设置。以下为获得QQ窗口输入文本框句柄的代码:HWNDCQQTailDlg::MyChildWnd(HWNDhwnd,intnum)//查找第num个子窗口,hwnd//为父窗口{HWNDChildWnd=0;for(inti=0;inum;i++){ChildWnd=::FindWindowEx(hwnd,ChildWnd,NULL,NULL);}returnChildWnd;}voidCQQTailDlg::FindQQTextWnd(HWNDhwnd)//查找输入文本框句柄{HWNDTempWnd;TempWnd=MyChildWnd(hwnd,4);TempWnd=MyChildWnd(TempWnd,23);TempWnd=MyChildWnd(TempWnd,1);TextWnd=TempWnd;}在获得了输入文本框句柄之后,就可以在文本框里设置你想发送的文本了。一般情况下可以向文本框发送WM_SETTEXT消息来实现,但是腾讯公司使用了一些技术,对文本框屏蔽了WM_SETTEXT消息。所以我们必须寻找其他的途径。经过发现,WM_CHAR消息没有被腾讯公司屏蔽。因此,可以使用这个消息把字符发送到文本框。以下为设置文本代码:voidCQQTailDlg::SetTextWndText(HWNDhwnd,LPSTRpstr)//设置文本{intlen=::strlen(pstr);for(inti=0;ilen;i++){::PostMessage(hwnd,WM_CHAR,pstr[i],0);}}5、文本的自动发送要想实现文本的自动发送,首先必须获得“发送”按钮的句柄,然后向其发送左单击消息和弹起消息就可以了。下面是获得“发送”按钮句柄的代码:EnumChildWindows(QQWnd-m_hWnd,(WNDENUMPROC)EnumChildProc,0);以及该函数调用的回调函数EnumChildProc:BOOLCALLBACKEnumChildProc(HWNDhwnd,LPARAMlParam){LPTSTRpstr;pstr=newTCHAR[100];intlen=GetWindowTextLength(hwnd);::GetWindowText(hwnd,pstr,len+1);char*p;p=strstr(pstr,发送);if(p&&len1){SendWnd=hwnd;}returnTRUE;}6、程序实现步骤本程序是在VC++2005开发平台上开发而成的,是一个基于对话框的MFC应用程序。程序实现的具体步骤如下:(1)在VC++2005下新建一个名为QQTail的解决方案,在应用程序类型中,选择基于对话框。(2)使用对话框编辑器,将对话框设计为如图4所示的窗口。(3)为“开始”、“停止”和“关闭”按钮添加消息处理函数,为两个文本框分别添加变量。(4)将上面所述的各种代码分别写进相应的函数。7、总结实现了一个类似于自动发送QQ消息的程序。参考文献钱能.C++程序设计教程(修订版).清华大学出版社