分享
 
 
 

制作QQ消息炸弹

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

QQ聊天机器人随想

原作:hottey(阿风)

前几日,看到杂志上有一篇关于开发QQ聊天机器人的文章。谈到了对QQ循环发送消息内容,感觉倒也很好玩,于是拿起Delphi开始了我的QQ聊天机器人之路。

首先要明白自己要做什么,大家都用过QQ,知道给别人发送消息的整个过程吧!要实现循环发送消息的功能该有以下几个条件:

1.必须是在聊天模式里进行。这样发送完一条消息后,QQ窗体还存在。

2.其次是要找到QQ文本窗体的句柄。

3.向QQ文本窗体中贴上你想说的话。然后自己点击发送按钮。

思路很简单,接着我们就要开始实施了。

首先要找到QQ文本窗体的句柄。这时我用到了SPY来查看QQ的窗体。结果如下图:

这样思路就出来了。要找到QQ文本窗体的句柄就得先找到它的父类即:标志为00620252 Class Name:AfxWnd42 Control ID:00000000。而要找到它就必须找到QQ消息对话框即:006B294“冷问梅 - 发送消息”#32770〔Dialog〕的句柄。

这时要用到几个Api函数:

1.FindWindowEx(

hWnd1:Long, //在其中查找子的父窗口,如设为0,表示使用桌面窗口(通常说的顶级窗口都认为是桌面的子窗口)

hWnd2:Long, //从这个窗口后开始查找。如设为0,表示对第一个子窗口开始搜索。

Lpsz1:String, //欲搜索的类名,0表示忽略。

Lpsz2:String //欲搜索的类名,0表示忽略。

);

2.GetWindow(

hWnd:Long, //源窗口。

wCmd:Long //指定结果窗口与源窗口的关系(这里用GW_CHILD)表示寻找源窗口的第一个子窗口。

);

3. GetDlgItem(

hWnd:Long, //源窗口的句柄。

Int: nIDDlgItem //要在其中查找的窗口的ID号

);

其实刚开始找QQ对话窗口时,我先想到的是FindWindow(),这个函数可以直接通过窗口标题名来查找窗体句柄。

我是这样找的:

var hparent:HWND;

hparent:=FindWindow(nil, '发送信息'); //这对2003以前的版本还是很有效的^_^

结果却是返回错误。Why?

后来仔细一看,发现每次QQ2003的标题都在变:如上图是:冷问梅 - 发送消息,要是你又对一个人发信息就会变成:蓝色的风 – 发送消息(举个例子)。

这也许是QQ2003采取的一种安全措施吧!呵呵!你们也许会看见网上针对QQ2003发送消息炸弹的工具有时要是输入对方的昵称的原因。(便于通过昵称得到窗体句柄)。

不过有没有更好的方法呢!有!这时就要用到FindWindowEx()了。仔细看一下它的参数,关键是第二个hWnd2——我们可以通过它来多次调用FindWindowEx找到符合条件的子窗口。以下是我的代码:

var hparent:HWND; //定义为全局变量。来记录每次调用FindWindowEx()后找到的窗体的句柄。

PRocedure TForm1.FormCreate(Sender: TObject);

begin

hparent:=0; //初始化,查找桌面所有的顶级窗口开始。

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var hbutton,hbutton1:HWND;

begin

repeat

hparent:=findwindowex(0,hparent,'#32770',nil); //QQ对话框的类为#32770,这样循环调用FindWindowEx()就能每次时钟生效时更新hparent的值。从已查找的句柄为hparent的窗体后查找符合要求的窗体。

hbutton:=findwindowEX(hparent,0,nil,'发送(&S)'); //每次判断找到的窗口的句柄,看这个窗体中是否存在'发送(&S)'按钮。存在即找到了正确的QQ对话框。

until hbutton<>0; //找到QQ对话框后跳出循环。

hbutton1:=findwindowex(hparent,0,nil,'聊天模式(&T)') ; //找到QQ对话窗体后,查找聊天模式按钮句柄。

if hbutton1<>0 then //若此时存在聊天模式按钮即现在QQ窗体处于消息模式状态。

sendmessage(hbutton1,BM_CLICK,0,0); //给聊天模式按钮发送单击消息。将窗体转换为聊天模式。

end;

这样我们就成功的找到的QQ对话框。和成功设置对话框为聊天模式了。任务总算先完成了一些,呵呵!更郁闷我的还在后头了。

接着,就要开始查找QQ输入文本的那个窗体的句柄了。这时我用到的是GetDlgItem()大家知道一个窗体中某一类控件的Control ID在这个窗体类中是不变的(除去一些静态文体外)过SPY我获知QQ输入文本的那个窗体的Control ID为0000037E。于是我写了下面的语句。

Var hmemo:HWND;

hmemo:=GetDlgItem(hparent,$0000037E);

结果发现写得东东完全没有自己预想的效果。呵呵!还是拿起SPY,哈!发现竟然不止一个控件的ID为0000037E。并且我们想要得到QQ输入文本的那个窗体的位置也不是最前一个(要是最前一个,通过上面的语句也是可以找到的^_^)。郁闷了不是。没办法还是从它的父类开始吧!可不能在一步求成了。仔细看看上图。发现了吧!

标志为00620252 Class Name:AfxWnd42 Control ID:00000000的即是QQ输入文本的那个窗体的父类,并且它是所有Class Name:AfxWnd42中位置最前的那一个。于是我们就可以找到它的句柄。跑不掉了。有了它,QQ输入文本的那个窗体的句柄也就很容易找到了,哈哈!以下是我的代码:

Var hmemo,hmemo1:HWND;

hmemo=GetDlgItem(hparent,$00000000); //找到父类。

hmemo1=GetWindow(hmemo1,GW_CHILD); //得到父类下的第一个子窗口句柄(hmemo1即QQ输入文本的那个窗体的句柄^_^大功告成)

这里顺便说一下GetWindow()用法:

GetWindow(

Hwnd:Long, //源窗口句柄。

wCnd:Long //指定结果窗口与源窗口的关系。(GW_CHILD为得到源窗体下的第一个子窗口句柄)

)

更多的常数关系你们就去查看MSDN吧!这里就不必占用寒泉的空间了。哈!

到此,QQ对话框和QQ输入文本窗口的句柄我们都已经得到了,以下的步骤就是把你要写的话,贴进QQ输入文本窗口,点一下发送,就郁闷别人吧!

现在贴出我的一段代码以供大家参考:

procedure TForm1.FormCreate(Sender: TObject);

begin

i:=0;

//导入文件内容到combobox控件。

combobox1.Items.LoadFromFile(extractfilepath(application.ExeName)+'text.txt');

combobox1.Text:=combobox1.Items.Strings[0];

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var hmemo1:HWND; //hmemo1为找到的QQ文本输入框句柄

begin

if checkbox1.Checked then //点击了循环发送复选框。

begin

if i>combobox1.Items.Count-1 then

i:=0;

edit1.Text:=combobox1.Items.Strings[i];

edit1.SelectAll;

edit1.CopyToClipboard; //拷贝到剪切板

sendmessage(hmemo1,WM_PASTE,0,0); //对QQ输入文本窗体发送粘贴消息。

sendmessage(hbutton,BM_CLICK,0,0); //点击发送按钮

i:=i+1;

end;

if checkbox1.Checked=false then //没有点击了循环发送复选框。

begin

edit1.Text:=combobox1.Text;

edit1.SelectAll;

edit1.CopyToClipboard;

sendmessage(hmemo1,WM_PASTE,0,0);

sendmessage(hbutton,BM_CLICK,0,0);

end;

end;

附上简要说明:由于本人所知有限,不太会用剪切板函数对将已知字串拷贝到剪切板的方法还不知道。所以只能借道于控件上。因为所有文本类控件都有一个方法即——edit1.CopyToClipboard,所以只能先将Edit1变为不可见控件。每次先将要发送的内容传给Edit1,而后在将Edit1的内容CopyToClipboard。哈!这只是一个取巧的法子,大家要是知道有什么更好的方法还望告知在下,呵!

后记:

以上代码是针对QQ2003版本。虽然网上有如:飘叶千夫指的好工具。不过作为一个小小菜鸟。但又喜欢编程的人来说。自己DIY(do it youtself)一个也是很爽的一件事吧!我自己也参照飘叶千夫指做了一个,感觉具备了它的使用功能吧!还不错。其实也没有太多技术性的东西,只是运用了几个API函数而已。只希望对刚刚学Delphi的朋友有所帮助,当然高手是用不着的了。

注明:QQ2004有些改动.为了方便我把新改的代码帖上来:

procedure TForm1.Timer1Timer(Sender: TObject);

var hbutton,hbutton1,hmemo,hmemo1,hparent1:HWND;

begin

repeat

hparent:=findwindowex(0,hparent,'#32770',nil);

//QQ2004就是多了下面这句,Memo上又多了一层窗口

hparent1:=findwindowex(hparent,0,'#32770',nil);

until hparent1<>0;

hbutton:=findwindowEX(hparent1,0,nil,'发送(&S)');

hbutton1:=findwindowex(hparent1,0,nil,'聊天模式(&T)');

if hbutton1<>0 then

sendmessage(hbutton1,BM_CLICK,0,0);

hmemo1:=GetDlgItem(hparent1,$00000000);

hmemo:=getwindow(hmemo1,GW_CHILD);

if hmemo<>0 then

begin

if checkbox1.Checked then

begin

if i>combobox1.Items.Count-1 then

i:=0;

edit1.Text:=combobox1.Items.Strings[i];

edit1.SelectAll;

edit1.CopyToClipboard;

sendmessage(hmemo,WM_SETTEXT,0,0);

sendmessage(hmemo,WM_PASTE,0,0);

sendmessage(hbutton,BM_CLICK,0,0);

i:=i+1;

end;

if checkbox1.Checked=false then

begin

edit1.Text:=combobox1.Text;

edit1.SelectAll;

edit1.CopyToClipboard;

sendmessage(hmemo,WM_SETTEXT,0,0);

sendmessage(hmemo,WM_PASTE,0,0);

sendmessage(hbutton,BM_CLICK,0,0);

end;

end;

end;

有需要的朋友请到我的网站去下载(位于我的作品里):

作者网站:http://asp.itdrp.com/hottey

hottey 于2004-5-30日修改

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有