(二)C# QQ讨论组广告群发工具——QQ登陆功能的实现下篇(附源码)

C# QQ登陆功能的实现下篇,由于看到园子里有朋友说需要讲解和剖析实现的步骤,前面的QQ登陆实现只有代码,所以这篇补上:C#/Java技术交流群:96020642,传送门:Rolends

(一)分析

1、当运行QQ.exe后会出现qq登陆界面的窗体
(二)C# QQ讨论组广告群发工具——QQ登陆功能的实现下篇(附源码)插图

2、我们用spy++分析窗体可以看到窗体有2个子控件,一个是账号输入框,一个密码框
(二)C# QQ讨论组广告群发工具——QQ登陆功能的实现下篇(附源码)插图1

3、再用spy++做事件分析,让spy++挂载hook后点解登陆按钮可以发现,按钮点击的坐标
(二)C# QQ讨论组广告群发工具——QQ登陆功能的实现下篇(附源码)插图2

(二)上面我们详细分析了登陆过程的操作步骤需要的信息,现在来实现

1、首先运行QQ,使用 Process pro = Process.Start(qqPath); 这个方法来运行QQ
2、然后我们需要找到登陆窗体的句柄,需要EnumDesktopWindows这个API来实现

函数原型:

 C# Code By wuleba.com

1
2
3
4
5

BOOL WINAPI EnumDesktopWindows (
__in_opt HDESK hDesktop,
__in WNDENUMPROC lpfn,
__in LPARAM lParam
);

大家都知道.net调用API比较烦,那么我们需要一个工具来简化我们的操作,在这里推荐2个工具,pinvoke.net(http://www.pinvoke.net/)和P/Invoke Interop Assistant(http://clrinterop.codeplex.com/)后者是一个开源项目,个人来说喜欢前者一些,工具很简单一看就会,就不讲解了,接上。

我们需要EnumDesktopWindows来找到登陆窗体,这个api 的声明如下:

 C# Code By wuleba.com

1
2
3
4
5
6

public delegate bool EnumDesktopWindowsDelegate (IntPtr hWnd, uint lParam);
[DllImport (“user32.dll”, EntryPoint = “EnumDesktopWindows”, ExactSpelling = false,
CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs (UnmanagedType.Bool)]
public static extern bool EnumDesktopWindows (IntPtr hDesktop,
EnumDesktopWindowsDelegate lpEnumCallbackFunction, IntPtr lParam);

3、找到登陆窗口之后我们需要找到登陆窗口里面的控件,这过程我们需要使用另一个API就是EnumChildWindows,函数原型:

 C# Code By wuleba.com

1
2
3
4

BOOL EnumChildWindows (
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam);

.net API声明:

 C# Code By wuleba.com

1
2
3
4
5

[DllImport (“user32.Dll”)]
[return: MarshalAs (UnmanagedType.Bool)]
public static extern bool EnumChildWindows (IntPtr parentHandle,
EnumChildWindowsDelegate callback, IntPtr lParam);
public delegate bool EnumChildWindowsDelegate (IntPtr hwnd, IntPtr lParam);

找控件方法如下:

 C# Code By wuleba.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public static List<IntPtr> FindControl (IntPtr hwnd,
string className, string title = null)
{
List<IntPtr> controls = new List<IntPtr>();
IntPtr handle = IntPtr.Zero;
while (true)
{
IntPtr tmp = handle;
handle = WinAPIHelper.FindWindowEx (hwnd, tmp, className, title);
if (handle != IntPtr.Zero)
{
controls.Add (handle);
}
else
break;
}
return controls;
}

4、经过上面我们找到2个子控件,现在需要为2个子控件设置值,对于一般的文本框我们可以用SETText消息来实现,对于特殊的输入框,我们只能模拟按键实现:

首先设置QQ号码WinAPIHelper.SendMessage(cons[0], WinAPIHelper.WM_SETTEXT, IntPtr.Zero, new StringBuilder(mainQQ)),其中cons[0]为输入框的句柄,这样就输入了QQ号码,输入密码需要以下步骤
A)窗体置顶,b)窗体获取焦点,c)输入控件获取焦点,d)发送按键

 C# Code By wuleba.com

1
2
3
4

WinAPIHelper.BringWindowToTop (hLogonWnd) //使用BringWindowToTop这个API来实现置顶
WinAPIHelper.SetForegroundWindow (hLogonWnd) //使用SetForegroundWindow这个API来实现获取焦点
WinAPIHelper.SendMessage (cons[0], WinAPIHelper.WM_SETFOCUS, 0x001a0494, 0) //使用SETFocus来设置控件焦点
SendKeys.SendWait (mainQQPwd) //这个类来实现密码输入模拟

5、经过上面步骤我们实现信息的输入,现在我们需要点解按钮
通过spy我们的到了按钮的坐标信息,关于点击的实现参照:https://www.wuleba.com/4154.html

6、登陆操作过程完成,接下来就等待登陆结果,我们需要使用EnumDesktopWindows不断的来获取窗体进行辨别。

版权声明:

小编:吾乐吧软件站

链接:https://www.wuleba.com/4155.html

来源:吾乐吧软件站

本资源仅供个人学习,禁止用于商业用途。下载后请于24小时内删除,并支持正版或原作者。因使用本资源导致的任何法律纠纷或损失,由使用者自行承担。

THE END
上一篇 SuperGeek Free Document OCR 2.3.1 英文OCR文字识别
下一篇 选择“关机”还是“睡眠”?
相关内容
转发
5
点赞
分享
全部转发 0 只看作者
按时间倒序 按时间正序

全部评论 5 只看作者
按时间倒序 按时间正序
天涯
。。。模拟点击登录框啊。。。你确定sendkeys可以输入密码?

还以为是分析出了QQ的登陆协议呢。。。
2012年4月22日 11:22 0 回复
你没有看上一篇,看了你就不会这样问了:https://www.wuleba.com/4154.html
2012年4月22日 11:50 0 回复
momoyi
如果这篇是上篇,或许会更好
2012年4月22日 10:40 0 回复
感谢Rolends~~
2012年4月22日 10:37 0 回复
初学者
开源的,必须支持
2012年4月22日 10:36 0 回复
赞赏支持
微信收款码
微信扫一扫
支付宝收款码
支付宝扫一扫
投诉内容
0/200
上传图片(最多3张,单张不超过2MB)
生成分享图片
正在生成预览...