QQ登陆功能的实现2
QQ登陆功能的实现2
由于看到园子里有朋友说需要讲解和剖析实现的步骤,前面的QQ登陆实现只有代码,所以这篇补上
1. 分析
1). 当运行QQ.exe后会出现qq登陆界面的窗体
2). 我们用spy++分析窗体可以看到窗体有2个子控件,一个是账号输入框,一个密码框
3). 再用spy++做事件分析,让spy++挂载hook后点解登陆按钮可以发现,按钮点击的坐标
2. 上面我们详细分析了登陆过程的操作步骤需要的信息,现在来实现
1). 首先运行QQ,使用 Process pro = Process.Start(qqPath);这个方法来运行QQ
2). 然后我们需要找到登陆窗体的句柄,需要EnumDesktopWindows这个API来实现
函数原型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 的声明如下
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);
使用这个API,然后根据pid就可以找到登陆窗口了3). 找到登陆窗口之后我们需要找到登陆窗口里面的控件,这过程我们需要使用另一个API就是EnumChildWindows,函数原型:
BOOL EnumChildWindows(
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam);
.net API声明
[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);
找控件方法如下
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)发送按键
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我们的到了按钮的坐标信息,关于点击的实现参照http://www.cnblogs.com/Rolends/archive/2012/04/18/2454964.html
6). 登陆操作过程完成,接下来就等待登陆结果,我们需要使用EnumDesktopWindows不断的来获取窗体进行辨别
word里写还是不行,发出来乱完了
QQ登陆功能的实现2的更多相关文章
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- C# 实现简单仿QQ登陆注册功能
闲来没事,想做一个仿QQ登陆注册的winform,于是利用工作之余,根据自己的掌握和查阅的资料,历时4天修改完成,新手水平,希望和大家共同学习进步,有不同见解希望提出! 废话不多说,进入正题: 先来看 ...
- 从零开始编写自己的C#框架(15)——Web层后端登陆功能
对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证.用户在线记录.相关日志记录.单用户或多用户使用帐号控制等,都是在这个页面进行处理的. 1.在解决方案中创建一个Web项目,并将它设置 ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 网站集成QQ登录功能(转)
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- DRF框架QQ登录功能
用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...
- Qt 之 模仿 QQ登陆界面——样式篇
一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...
- 如何用php实现qq登陆网站
PHP网站入QQ互联,使用QQ号码登录网站. 平台接口系列文章 PHP网站入QQ互联,使用QQ号码登录网站 PHP网站接入人人网,授权登陆 php facebook api网站接入facebook 1 ...
随机推荐
- 自己写的通过ADO操作mysql数据库
#include <iostream> #include <windows.h> #include <atlstr.h> #import "c:\Prog ...
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- JavaScript 日期格式化 简单有用
JavaScript 日期格式化 简单有用 代码例如以下,引入jquery后直接后增加下面代码刷新可測试 Date.prototype.Format = function (fmt) { //auth ...
- DateTime操作,时间范围,加减
DB里边存的是char类型数组的时间,例如20151111 12171220000,现在需要把这个时间加减5s,组成 一个时间范围 然后再写存储过程. 想到的办法就是把这个时间先转换成DateTime ...
- RuntimeWarning: Parent module 'test_project.test_case' not found while handling absolute
1.Pycharm2016.3.2,导入unittest框架后,运行脚本总是warming,但不影响脚本具体执行 2.通过网上查询,将"C:\Program Files\JetBrains\ ...
- windows下的txt格式转换成linux下的TXT
存在的问题是 多出一个方框或者黑格子 主要是因为bash 不能忽略windows的问题 用sed 命令来处理,分别是windows转linux,linux转windows sed -e 's/.$// ...
- Django框架学习——python模拟Django框架(转载)
原贴来源 http://wiki.woodpecker.org.cn/moin/ObpLovelyPython/AbtWebModules python实现web服务器 web开发首先要有web服务器 ...
- 零基础学python-2.18 异常
这一节说一下异常except 继续沿用上一节的代码.我有益把文件名称字搞错.然后在结尾部分加上异常捕捉: try: handler=open("12.txt")#在这里我特别将文件 ...
- Bubble Cup X - Finals [Online Mirror] B. Neural Network country 矩阵快速幂加速转移
B. Neural Network country time limit per test 2 seconds memory limit per test 256 megabytes Due to t ...
- EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376 EasyCamera开源摄像机拥有获取摄像机实时快照并上传至EasyDarwin云平 ...