QQ聊天机器人
前几日,看到杂志上有一篇关于开发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;

转载于:https://www.cnblogs.com/blogpro/p/11426756.html

QQ聊天机器人 Delphi代码相关推荐

  1. 机器人聊天软件c#_C#制作简易QQ聊天机器人

    最近对QQ聊天机器人比较感兴趣,奈何一直没找到C#的源码,就自己摸索,好了废话不多说了,开始正题. 首先我们要准备的是C# 的SDK下载地址:http://pan.baidu.com/s/1geW0X ...

  2. webqq2协议分析和qq聊天机器人简单实现(转)

    webqq2协议分析和qq聊天机器人简单实现 转之http://hfutxf.javaeye.com/blog/800866 通过webqq接口,可以实现发送qq消息接收qq消息等,这样,想实现一个q ...

  3. python qq聊天机器人_Python QQBot库的QQ聊天机器人

    本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 1.安装 pip install qqbot 2.主动发出消息 from qqbot import ...

  4. 基于PaddleHub的QQ聊天机器人

    基于PaddleHub的QQ聊天机器人 一. 项目背景 本项目是参加[AI达人特训营]的作品. 当你在和朋友在QQ群里划水摸鱼时,你是否会感到有一丝枯燥,没事别担心.为了增加群友们的划水乐趣,提高群友 ...

  5. webqq2协议分析和qq聊天机器人简单实现

    转之http://hfutxf.javaeye.com/blog/800866 通过webqq接口,可以实现发送qq消息接收qq消息等,这样,想实现一个qq聊天机器人,就不是什么难事情了了,下面开始一 ...

  6. python qqbot库_Python QQBot库的QQ聊天机器人

    本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下 项目地址:https://github.com/pandolia/qqbot 1.安装 pip in ...

  7. 基于Nonebot2实现QQ聊天机器人商品查询【Nonebot插件教程】

    文章目录 前言 商品页面分析 插件编写 彩蛋 前言 本插件是基于Nonebot2 的QQ聊天机器人.通过集成京东商品爬虫,将京东网站中的优质产品推荐给用户,本文对京东官网源码信息进行了分析,并附上了完 ...

  8. QQ 聊天机器人小薇 2.0.0 发布!

    本次发布主要加入了支持讨论组聊天,并增强了稳定性.另外,官方小薇 QQ 机器人已经下线,大家要体验的话请 自建私服~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务, ...

  9. QQ 聊天机器人小薇 2.1.0 发布!

    本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...

  10. 如何用图灵添加一个简单的QQ聊天机器人

    tip:这里是使用简单的软件,添加一个QQ聊天机器人, 如果想要用代码实现, 请按Ctrl + F4 本文比较墨迹, 看的懂的话, 请开3倍速.本文写于2017/05/9,过期就不用看了 1.进入图灵 ...

最新文章

  1. oracle:SAVEPOINT(保存点)
  2. 一位 CEO 在战略沟通会上的员工问答实录
  3. python 不执行函数_解决python调用自己文件函数/执行函数找不到包问题
  4. 怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序
  5. linux下运行yolo,Ubuntu下CPU/GPU模式YOLOv3代码运行
  6. 3个平台下的ffmpeg——ffmpeg编译
  7. linux连不上网 ens33,如何解决Linux 系统下 ifconfig 命令无网络接口 ens33
  8. LabVIEW中调用Halcon
  9. 华为笔记本电脑触摸板失灵解决方法(触摸屏同理)
  10. 翟菜花:四家电商平台Q3财报梳理:涨幅狂欢后的沉思
  11. 用java计算小数的双阶乘
  12. 读书笔记——我的学习与研究经历(杨振宁/2012)
  13. Axure移动端实用元件库分享
  14. 江苏电信服务器托管/1U托管/4G硬防
  15. 2022年最实用的DevOps工具
  16. pandownload + speedpan下载器 tampermonkey + IDM下载器
  17. sklearn使用实践之对moons数据集进行决策树训练并优化模型
  18. 计算机模拟双缝干涉实验报告,杨氏双缝干涉实验报告.doc.pdf
  19. 不玩VR游戏、不看VR视频,你的春节可能就白过了!
  20. LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

热门文章

  1. 计算机表格简单教程视频教程,电脑如何制作表格步骤 教你制作简单的excel表格...
  2. python写歌词解析器 王菲-传奇
  3. [ajax] 基础 HTTP相关问题-GET-POST-XHR使用-jQuery中的ajax-跨域-同源-jsonp-cors
  4. 最短路径算法----Floyd-warshall(十字交叉算法证明)
  5. _initialize() 区别 __construct()
  6. 反应式框架Reactor中的Mono和Flux
  7. springboot将模板生成pdf文件
  8. setPositiveButton和setNegativeButton和setNeutralButton
  9. Android开发实现选择城市界面,可根据拼音、首字母进行搜索
  10. 金蝶/K3Wise 月末结账时候提示:违反违反了PRIMARYKEY约束,PK_POZnvBal,不能在对象POinvBal中插入重复键