目前的QQ2011版本中,其登陆界面上除了QQ号输入框和密码输入框,其他的的按钮都是绘图绘上去的,均无窗口句柄。
QQ登录窗口的窗口类为'TXGuiFoundation',窗口标题为'QQ2011'。
QQ账号输入框的窗口类为'TXEdit',窗口标题为空,密码输入框的窗口类为'Edit',窗口标题是动态的'A~Z'。
由于登陆界面的【登录】按钮无窗口句柄,因此无法向按钮发送消息,由此猜想其界面的所有操作均是通过特定消息来操作的。
但是向登录窗口发送WM_LBUTTONDOWN和WM_LBUTTONUP消息来模拟鼠标点击登录按钮的操作无任何反应。
通过Spy++监测QQ2011登录过程中的消息流发现,其消息基本都是直接发送至登录窗口的,所以逐条查看带有WM_LBUTTONDOWN
和WM_LBUTTONUP消息的地方 ,并发现一组 WM_LBUTTONDOWN、 WM_LBUTTONUP ,查看消息属性发现WM_LBUTTONDOWN
消息中的wParam参数为$00000001,lParam参数为$00FD013A,WM_LBUTTONUP消息的wParam参数为$00000000,lParam参数为$00FD013A。
因此猜想模拟鼠标点击登录按钮的消息中, lParam参数为$00FD013A代表这是个用于登录按钮的WM_LBUTTONDOWN或WM_LBUTTONUP消息,而
wParam参数为$00000001、 $00000000 正好区分了 WM_LBUTTONDOWN、WM_LBUTTONUP消息。经测试此猜想正确,发送登录消息成功!
经反复监测鼠标点击登录按钮的消息流发现WM_LBUTTONDOWN、WM_LBUTTONUP的lParam参数是一个范围值并非固定值,除了$00FD013A,还有
$00F80137等等等~具体范围木有时间去测试确定了~
源代码如下:
1 program OneKeyRun;
2
3 uses
4 Windows,ShellAPI,Messages;
5 {$R *.Res}
6
7 var
8 WinHandle:Integer=0;
9 Count:Integer=0;
10
11 begin
12 ShellExecute(0,'Open','E:\Program Files\Tencent\QQ\Bin\qq.exe',nil,nil,SW_SHOW);
13 repeat
14 begin
15 Sleep(5000);
16 WinHandle:=FindWindowEx(0,0,'TXGuiFoundation','QQ2011');
17 Inc(Count);
18 end;
19 until (WinHandle>0) or (Count>200);
20 if WinHandle>0 then
21 begin
22 PostMessage(WinHandle,WM_LBUTTONDOWN,$00000001,$00FD013A);
23 PostMessage(WinHandle,WM_LBUTTONUP,$00000000,$00FD013A);
24 end;
25 end.
本文章及程序源码旨在分析技术,省去手动登录多个QQ的麻烦,不含有任何恶意破坏和攻击的企图。