OICQ消息随你发——欢迎大家试用!(5分)

  • 主题发起人 coolbaby
  • 开始时间
我也要一份
guohong0808@sohu.com
 
今天公司里几个高手先后看到我的程序
居然不约而同地给我同一个评价:“土”!
唉,真丢人。。。
今天21cn上不了,不知为何
干脆贴到这里来罢
其实这个程序主要的内容不是如何发qq信息
而是如何找到某一个正在运行的应用程序窗口上任意一个控件的句柄
我的方法是(以一个button为例)
用FindWindow找到窗体的句柄后
根据按钮的类别,循环找这个窗体上的每个'Button',然后用GetWindowText和Button的Caption比较,就可以找到想要的按钮句柄了
下面贴出我的程序,望大家批评指教
其中部分代码参考大富翁上某一帖子(忘了是哪个了)
To wjiachun:在下只想和大家交流交流,没敢要分
何况。。。这东西那么“土”。。。。
unit OicqSendForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TfrmMain = class(TForm)
memText: TMemo;
edtTime: TEdit;
Label1: TLabel;
Bevel1: TBevel;
Label2: TLabel;
bbtnStart: TBitBtn;
bbtnEnd: TBitBtn;
bbtnHelp: TBitBtn;
Timer: TTimer;
procedure bbtnStartClick(Sender: TObject);
procedure bbtnEndClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure bbtnHelpClick(Sender: TObject);
private
{ Private declarations }
FTextHandle: HWND;
//qq消息输入框句柄
FButtonHandle: HWND;
//发送按钮输入框
public
{ Public declarations }
end;

var
frmMain: TfrmMain;
implementation

//这个函数取当前qq发送窗口上“送讯息”的按钮的句柄
//function EnumChildWindowsProc(hwnd: Integer;
lparam: Longint):Boolean;
stdcall;
function GetButtonHandle(hwnd: Integer;
lparam: Longint):Boolean;
stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Button' then
begin
GetWindowText(hwnd,buffer1,100);
if buffer1 = '送讯息(&S)' then
begin
PInteger(lparam)^ := hwnd;
//得到目标控件的Hwnd(句柄)
Result:=False;
//终止循环
end;
end;
end;
//end of function
//这个函数取当前qq发送窗口上消息框句柄
//function EnumChildWindowsProc(hwnd: Integer;
lparam: Longint):Boolean;
stdcall;
function GetEditHandle(hwnd: Integer;
lparam: Longint):Boolean;
stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
//找到发消息的目标窗口的目标控件
if StrPas(Buffer)='Edit' then
begin
GetWindowText(hwnd,buffer1,100);
PInteger(lparam)^ := hwnd;
//得到目标控件的Hwnd(句柄)
Result:=False;
//终止循环
end;
end;
//end of function
{$R *.DFM}
procedure TfrmMain.bbtnStartClick(Sender: TObject);
var
Handle: Integer;
tmpHandle: Integer;
begin
{取句柄}
Handle := FindWindow(nil,'对话模式');
//就是窗口的Caption
if Handle<>0 then
begin
tmpHandle := Handle;
//在这里循环取到想要的句柄为止
//取发送按钮的,FButtonHandle
EnumChildWindows(Handle,@GetButtonHandle,Integer(@Handle));
FButtonHandle := Handle;
//取消息输入框的,FTextHandle
EnumChildWindows(tmpHandle,@GetEditHandle,Integer(@tmpHandle));
FTextHandle := tmpHandle;
Timer.Interval := StrToInt(edtTime.Text);
Timer.Enabled := true;
end;
//end of if
end;

procedure TfrmMain.bbtnEndClick(Sender: TObject);
begin
Timer.Enabled := false;//关闭定时器
end;

procedure TfrmMain.TimerTimer(Sender: TObject);
begin
{定时发送}
//设发送文本
SendMessage(FTextHandle,WM_SETTEXT,0,Integer(pchar(memText.Text)));
//发送按钮
//SendMessage(FButtonHandle,BN_CLICKED,0,0);
SendMessage(FButtonHandle,WM_LBUTTONDOWN,0,0);
SendMessage(FButtonHandle,WM_LBUTTONUP,0,0);
end;

procedure TfrmMain.bbtnHelpClick(Sender: TObject);
var
sHelp: String;
begin
//帮助
sHelp := '打开要发送的对象窗口'+#13+
'选择对话模式后点[开始]!';
ShowMessage(sHelp);

end;

end.

 
[:(]我也以为是能随便发给陌生人的[^]
不过也谢谢你了
 
To wjiachun:
我也想做一个能随便发给陌生人的
但不知道它的数据包格式。。。
 
to coolbaby:
[:D][:D][:D]
你的那个小老头不见啦…… ^e^ 看来你也是利用了IE的漏洞啊……
[:(][:(] 我也以为是可以向任意QQ发信息呢……(以前成者小虫做过…但新版本不行啦)
 
很不错,再努力!!!!!!
 
to 萧月禾:编程有2年多了,很希望能与你交流,email:zcxie◎263.net
QQ: 34518152
 
我是觉得你的程序够土的了[:D]
 
to grays:
我已经意识到我很土了
话说我确实打算做一个可以发给陌生人的程序
有什么好的资料或建议提供?
能否取得oicq的数据包??
 
to xan:
秋月无边
我加你加不上呀,总是超时
 
好象sysgate的firewall能取得数据包,而且能以16进制显示出来,这样你可以看数据包了~
加油!
前途是光明的!没有做不到的事情!
 
你做的软件很好用,还有别的新软件吗?
有。希望你能通知我一下。谢谢!
E-MAIL:Xz_Xugang@China.Com
 
//不知道它的数据包格式
不容易吧,好象已经加密了,以前曾经也有富翁搞过类似的项目,
不过现在好象没有听到风声了[:(]
 
好久上不了了。没想到大家讨论的怎么激烈。
不知道qq的消息数据格式,所以目前也只能用这种方法了。不过大家可以好好分析
qq数据包的格式。不过,好象目前没什么人分析出来了!sign!
 
本想结了
才5分,不好分啊
 
给我一个 whitefang7871092@hotmail.com
 
我有一个oicq的数据包格式的文件,在家里,希望下午能贴上来.
要是写出来了,不要忘记吧源码也贴上来哟!!
 
公开OICQ所有通讯协议
OICQ服务器系统通讯协议
协议说明:
协议由报文头(T)+发送者(T)+接收者(T)+报文类型(T)+报文长度(L)+报文内容组成
发送者和接收者是系统内的程序种类,OICQ服务器0x01,传真服务器0x02,WEB服务器0x03,打印服务器是0x04,聊天服务器是0x05,OICQ用户是0x0A。
OICQ用户到OICQ服务器的通讯协议 引导符 (0x81+0x0A+0x01)
报文类型 报文内容 报文说明
0x01 昵称(S)+肖像(M)+用户密码(S)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)+身份验证(T)新用户注册,身份验证用于当有人要将他加入好友时询问是否允许
0x02 服务号(L)+密码(S)+注册方式(T)老用户注册,方式分为0正常,1隐身
0x03 服务号(L)+对方服务号(L)+内容(S) 发送信息到某人
0x04 服务号(L)+组号(L)+内容(S) 广播信息,组号=0为全体
0x05 服务号(L)+朋友服务号(L) 查看朋友资料
0x06 服务号(L)+组名称(S) 增加组
0x07 服务号(L)+组编号(T)+组名称(S) 修改组名称
0x08 服务号(L)+组编号(T) 删除组
0x09 服务号(L)+移动人数(T)+{朋友服务号(L)+目的组号(T)} 移动组成员
0x0a 服务号(L)+起始编号(L)+回传个数(T)+查找标志(T) 看谁在线上
查找标志 1=向小找 2=向大找
0x0b 服务号(L)+SQL语句(S) 自定义查找
0x0c 服务号(L)+朋友服务号(L) 增加好友
0x0d 服务号(L)+朋友服务号(L)+加入原因(S) 请求加入好友
0x0e 服务号(L)+朋友服务号(L) 删除好友
0x10 服务号(L)+显示模式(T) 更改显示方式 1上线2隐藏3免打扰4离线
0x11 服务号(L)+监视服务号(L) 监视某人谈话
0x12 服务号(L)+昵称(S)+肖像(M)+用户密码(S)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)+身份验证(T)更改用户基本信息
0x13 服务号(L)+朋友服务号(L)+文件名(S)+文件长度(L) 请求发送文件
0x14 服务号(L)+朋友服务号(L)+允许/拒绝 是否允许发送文件
0x15 服务号(L)+朋友服务号(L)+文件内容(B) 发送文件
0x16 服务号(L) 连接测试报文
0x17 服务号(L)+朋友服务号(L)+同意标志(T) 应答对方请求加入好友
0=拒绝
1=同意
OICQ服务器到OICQ的通讯协议
报文类型 报文内容 报文说明
0x01 成功/失败(T)+服务号(L) 新用户注册结果返回
0x02 成功/失败(T)+组个数(T)+{组名称(S)+组编号(T)+朋友个数(T)+{朋友服务号(L)+肖像编号(T)+朋友状态(T)+朋友昵称(S)] 老用户注册结果返回
朋友状态
1=上线=2隐藏=3免打扰4离线
0x03 标志(T) + 朋友服务号(L)+信息(S)+信息类型(T) 标志 1=系统 2=用户
发送消息,服务号=0是系统消息
1=用户某某已经把你加为好友
2=用户某某请求你通过身份验证
3=用户某某同意了你的验证要求
4=用户某某拒绝了你的验证请求
0x04 成功/失败(T)+朋友服务号(L)+昵称(S)+肖像(M)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)朋友信息回送
0x05 成功/失败(T)+组编号(T)+组名称(S) 增加组结果回送 1/0
0x06 成功/失败(T)+组编号(T)+组名称(S)修改组名称结果回送1/0
0x07 成功/失败(T)+组编号(T) 删除组结果回送1/0
0x08 成功/失败(T) 移动组成员结果回送1/0
0x09 成功/失败(T)+在线个数(T)+{服务号(L)+昵称(S)+肖像(M)+省(T)+市(S)} 查找在线人员结果回送
0x0a 成功/失败(T)+找到个数(T)+{服务号(L)+昵称(S)+肖像(M)+省(T)+市(S)} 自定义查找结果回送(最多50)
0x0b 标志(T)+朋友服务号(L) 增加好友结果回送标志
0=数据库失败
=1成功
=2需要身份验证
=3对方不允许加入
=4需要身份验证且不在线
0x0c 朋友服务号(L)+昵称(S)+肖像号(M)+朋友状态(T) 给在线用户增加好友
0x0e 成功/失败(T)+朋友服务号(L) 删除好友结果回送
0x10 服务号(L)+显示模式(T) 显示模式回送 =1上线=2隐藏=3免打扰4离线
0x11 成功/失败 更改用户基本信息结果回送
0x12 朋友服务号(L)+文件名(S)+文件长度(L) 请求发送文件
0x13 朋友服务号(L)+允许/拒绝 是否允许发送文件 1允许 0拒绝
0x14 朋友服务号(L)+文件内容(B) 发送文件
0x15 朋友服务号(L)+当前状态(T)朋友状态回送(系统发送)=1上线=2隐藏=3免打扰4离线
0x16 服务号(L) 连接测试

不过不知道是不是最新版QQ的通信协议.
 
先问问你这些是从哪找来的
如果是csdn的话,那就算了吧
好象是“玉笛书生”为了积分自编的
不过我也没试过
谁试了告诉我
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
514
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部