博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QQ登陆功能的实现2
阅读量:5843 次
发布时间:2019-06-18

本文共 2553 字,大约阅读时间需要 8 分钟。

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()后者是一个开源项目,个人来说喜欢前者一些,工具很简单一看就会,就不讲解了,接上

     我们需要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
FindControl(IntPtr hwnd, string className, string title = null)
{
List
controls = new List
();
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我们的到了按钮的坐标信息,关于点击的实现参照

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

word里写还是不行,发出来乱完了

 

转载请注明:http://www.cnblogs.com/Rolends
你可能感兴趣的文章
openresty修改302的location
查看>>
Chef宣布100%开源,要走红帽模式?\n
查看>>
“迁移策略+新容器运行时”应对有状态应用的冷热迁移挑战
查看>>
利用人工智能提升团队包容性
查看>>
Oracle发布多语种虚拟机平台GraalVM 1.0
查看>>
Gil Zilberfeld问答:敏捷产品的规划与管理
查看>>
Lisk沙箱漏洞分析及解决方案
查看>>
Qt 工程管理
查看>>
Azul Systems推出Falcon,一个基于LLVM的新的Java即时编译器
查看>>
某些编程语言更容易出错?研究人员提出质疑
查看>>
90 后 CTO 创业 6 年,做了一件改变互联网的“小事”
查看>>
首份《敏捷回顾年度报告》发布
查看>>
Rust 1.30带来更多元编程支持,并改进了模块系统
查看>>
Slack桌面3.0迁移到BrowserView
查看>>
openresty 前端开发入门二
查看>>
用户超5亿,三年投10亿,开发者如何抢滩支付宝小程序蓝海?
查看>>
Uber:大规模系统下如何构建可伸缩的告警生态系统\n
查看>>
创新技术重塑未来物联网
查看>>
华中科大提出EAT-NAS方法:提升大规模神经模型搜索速度
查看>>
Etsy如何及为什么迁移到API优先的架构
查看>>