QQ登陸功能的實現2 - rolends1986 - 部落格園

weixin_34037977發表於2012-04-19

QQ登陸功能的實現2 - rolends1986 - 部落格園

QQ登陸功能的實現2

    由於看到園子裡有朋友說需要講解和剖析實現的步驟,前面的QQ登陸實現只有程式碼,所以這篇補上

   1.  分析

1). 當執行QQ.exe後會出現qq登陸介面的窗體
image

2). 我們用spy++分析窗體可以看到窗體有2個子控制元件,一個是賬號輸入框,一個密碼框
image

3). 再用spy++做事件分析,讓spy++掛載hook後點解登陸按鈕可以發現,按鈕點選的座標
image

  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 討論組廣告群發工具(已開發完成)索引

相關文章