急!如何对付新版的qq? (100分)

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写了一个控制qq的软件。都快成功了,还实现了自启动qq, 当要发送字数多时还能自动切割发送等等。没想到我只能控制老版本的qq. &nbsp;<br>&nbsp; 以前qq的发送消息的文本框的类属于Memo,我能控制; <br>&nbsp; 现在qq的发送消息的文本框的类属于RichEdit,我却没有办法控制; <br>(所谓控制就是把我文本框的内容通过句柄自动的复制到qq的发送消息的文本框上)<br>&nbsp; 这一点我感到很奇怪,因为我做了个模拟qq的界面,我却能控制,是不是qq用了什么技术处理,不能控制啦。 &nbsp;
 
下面是把实现把我软件中memo1中的文本拷贝到“对话模式”下的发送窗口中的代码: <br>procedure TForm1.Button2Click(Sender: TObject); <br>var <br>hParent, hMemo: HWND; <br>begin <br>Memo1.SelectAll; <br>Memo1.CopyToClipboard;//把Memo中选中的语句拷贝到剪贴板中 <br>hParent := FindWindow(nil, pchar('对话模式');// 找对话模式中窗口 <br>// 找到对话模式中的回话编辑框 <br>&nbsp; hMemo := ChildWindowFromPointEx(hParent, Point(100,330)),CWP_ALL); <br>// 如果有任何一个句柄没有找到都不能完成发送,并给出提示 <br>&nbsp;if hMemo=0 then <br>&nbsp; &nbsp; begin <br>&nbsp; &nbsp; &nbsp; ShowMessage('do not find hn hmemo'); <br>&nbsp; &nbsp; &nbsp; exit; <br>&nbsp; &nbsp; end; <br>&nbsp; &nbsp; &nbsp;SendMessage(hMemo,WM_PASTE,0,0); <br>&nbsp; end; <br>
 
我刚刚试过,一样可以自动发送文本!
 
我用这段代码控制qq时,就是没有反应,我也得到了所有的句柄啦,就是不能把我的文本发过去,奇怪,当然,qq中的按纽还是能控制的,代码如下: <br><br>procedure TForm1.Button1Click(Sender: TObject); <br>var <br>hParent,hButton : HWND; <br>begin <br><br>hParent := FindWindow(nil, pchar('对话模式');// 找对话模式中窗口 <br><br><br>hButton := FindWindowEx(hParent,0,nil, pchar('送讯息(&amp;S)')); <br><br>&nbsp;SendMessage(hButton,BM_CLICK,0,0); <br>end; <br><br>当然,我想肯定有高手知道如何用Api函数处理这个问题,要不然qq不是就没办法控制了,我想肯定还有不少朋友在研究这个 。<br>&nbsp;
 
xianjun朋友,不行啊,我试过好多遍了,可能你控制的qq不可以发小图标(也就是memo),<br>对于richedit 我控制不了。哪位高手快帮帮我啊!
 
xianjun朋友,不行啊,我试过好多遍了,可能你控制的qq不可以发小图标(也就是memo),<br>对于richedit 我控制不了。哪位高手快帮帮我啊!
 
我用它来控制MSN却可以。见鬼,可能是qq内部设置过了。
 
其实你用WM_SETTEXT就可以了:<br>&nbsp; &nbsp; SendMessage(HWND, WM_SETTEXT, 0, Longint(PChar(Trim(MemoText.Text))));<br>
 
复制到剪贴板的那一步是对的,不过不要用 SendMessage 发送粘贴消息<br>直接用虚拟按键,模拟按下 Ctrl + V:<br><br>procedure SendPaste;<br>begin<br>&nbsp; keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);<br>&nbsp; keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);<br>&nbsp; keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);<br>&nbsp; keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);<br>end;<br><br>当然,在这之前,先要让 qq 获得焦点,可以发送 WM_SETFOCUS 或者直接让用户去点[:D]<br><br>
 
挺简单的我也做过一个<br>对付新版qq可以使用<br>&nbsp;ClassName:='RICHEDIT';<br>&nbsp;hRichedit :=FindWindowEx(hParent,0,PChar(ClassName),'');<br>如果你真想做qq的控制软件 &nbsp;建议你去研究他的数据包<br>只用FindWindowEx是没有多少技术含量的<br>如果还有什么问题<br>给我发信吧<br>guoling21cn@163.com<br>^_^<br>
 
新版QQ有保护机制地
 
是这个原因,你打开spy++ &nbsp;去获取 &nbsp;QQ 发送窗口的 信息,结果怎么样,你看不到,<br>他改动了,利用了 * 密码框的原理,你是不能 &nbsp;SETTEXT 的,兄弟这个答案满意么??
 
无法保存数据: 3。<br><br>人在昆明朋友,我想你说的答案可能是对的,但是sky++好象在VC里才有啊,delphi里用什么<br>实现类似的功能呢?<br>&nbsp;您能不能模拟qq作一个不能被控制的memo或richeidt来呢。谢谢啦!<br><br>
 
<br>青云兄,首先我要说的是SPY++是通用的工具!接着希望你继续研究QQ的内核,新版的已经不是<br>那么简单了,还有用新方法来代替FINDWINDOWEX,有消息告诉我!<br>EMAIL:RESUN_SHAOQING@SOHU.COM
 
刚才我根据各位朋友的提示,一一做了尝试;<br>我这里能上网,但是qq用不起来,所以我还是模拟做了qq的界面。<br>xianjun朋友的SendMessage(HWND, WM_SETTEXT, 0, Longint(PChar(Trim(MemoText.Text))));<br>我试过了,好象没有什么反应。<br>-----------<br>beta 朋友的模拟按下 Ctrl + V的代码我也试过了,好象也不行。<br>---------------------<br>goling朋友的<br>ClassName:='RICHEDIT';<br>&nbsp;hRichedit :=FindWindowEx(hParent,0,PChar(ClassName),'');<br>我也试过了,开始不行,后来我明白了,qq上发送文本框的类是RichEdit,<br>我模拟做的是TRichEdit.;后来我把ClassName:='TRICHEDIT';就可以了,<br>但是假如我文本框有两个TrichEdit,我怎么知道我控制的哪一个呢。<br>况且hRichedit :=FindWindowEx(hParent,0,PChar(ClassName),'');只是<br>得到被控制的文本框的句柄,它和<br>hMemo := ChildWindowFromPointEx(hParent, Point(100,330)),CWP_ALL); <br>这个函数的作用是一样的,我想真正用来控制新版的qq可能还是不行。<br>-------------------------<br>不过大家提供的代码可能也不错,也许是我用错了,<br>但是我希望大家以后提供的时候,能不能向我那样提供完整一点。谢谢啦!<br><br>
 
我不知道你的新版QQ是指什么版, 我这里用的是2002.08.25 beta1<br>我是试过之后才说可以的<br>难道beta3就不行了?<br>SendMessage(HWND, WM_SETTEXT, 0, Longint(PChar(Trim(MemoText.Text))));<br>注意这里的Hwnd是指那个Richedit的Handle
 
旧版与新版的QQ所用的发送消息的类不同<br>主要是这样的<br>新版:在线QQ :TRICHEDIT<br>&nbsp; &nbsp; &nbsp; 隐身下线QQ:TMEMO<br>旧版:TMEMO<br>为了可以对付所有的QQ 可以对QQ的版本号进行判断<br>或者对MEMO和RICHEDIT都发送消息<br>(找不到的时候是对NULL的操作 我认为关系不大)<br>建议:不要使用自己模拟的QQ窗口<br>用spy++分析可以看到 QQ窗口一层包一层
 
goling朋友的方法我试过了,确实可以用,不过有一个问题我想向各位大虾们请教,那就是<br>qq里有一个“二人世界”的功能,这个功能我想在局域网里用socketServer和socketClient应该很<br>容易实现,但在因特网里该如何实现呢,那位大虾能够写一段代码演示一下,只要实现聊天的功能<br>就行了。但一定是两台不在同一个局域网里的机器。
 
这样不可以呀 , 那个写回复信息的窗体 Handle 找不到<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; h,hParent, hButton, hMemo: HWND;<br>&nbsp; ClassName : String ;<br>&nbsp; hRichEdit : HWND ;<br>begin<br>&nbsp; Memo1.SelectAll;<br>&nbsp; Memo1.CopyToClipboard;<br>&nbsp; try<br>&nbsp; &nbsp; &nbsp;ClassName:='TRICHEDIT';<br>&nbsp; &nbsp; &nbsp;hRichedit :=FindWindowEx(hParent,0,PChar(ClassName),'');<br>&nbsp; &nbsp; &nbsp;hParent := FindWindow(nil, '发送消息');<br>&nbsp; // &nbsp; hMemo := ChildWindowFromPointEx(hParent, Point(50,100), CWP_ALL);<br>&nbsp; &nbsp; hButton := FindWindowEx(hParent, 0, nil, '送讯息(&amp;S)');<br>&nbsp; &nbsp; if (hParent = 0) or (hMemo = 0) or (hButton = 0) then<br>&nbsp; &nbsp; &nbsp; MessageBox(Handle, ' NoForm ', ' 提示', MB_ICONWARNING)<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; SendMessage(hRichedit, WM_PASTE, 0, 0);<br>&nbsp; &nbsp; &nbsp; SendMessage(hButton, BM_CLICK, 0, 0);<br>&nbsp; &nbsp; end;<br>&nbsp; except<br>&nbsp; &nbsp; MessageBox(Handle, 'Wrong ', ' wrong', MB_ICONWARNING);<br>&nbsp; end;<br>end;
 
大家好,感谢大家提出的宝贵意见,我现在我们当地的一个网站公司买了一个空间,<br>域名为:www.yzsoftware.com<br><br>我不知道放些什么好,也没有做过什么网站,我想谁有兴趣和我共同开发的。开发好后,<br>实际上该网站也是您的。<br><br>如果哪位有兴趣,可以把你希望的网站源码发给我,我把它发布到我的 www.yzsoftware.com<br>上,我自己再在上面加上我的一些东西。<br><br>我们可以共同作为该站的斑竹,有兴趣相搞delphi技术的个人网站,而又苦于没有空间的朋友,<br>可以跟我合作,互惠互利。<br><br>我也可以拿出20M 给你做为完全的个人私有。有兴趣的朋友快跟我联系:<br>yzdzc@163.com<br><br>dai_z_cun@yzsoftware.com<br><br><br><br>
 
顶部