掩耳盜鈴之使用WebBrowser封裝網頁


  最近學校的破網越來越不像話了,換了這Win7機器后,Dr.Com就一直掉,換了各種版本,也不行,無奈,我只得換成了網頁登錄模式。但是這上網還要開個網頁不能關,無形中增加了我對電腦整潔度的惡評,所以,我決定封裝這個丑陋的界面:

  使用WebBrowser控件用來加載這個頁面,且設置Visibility="Hidden" 讓它不顯示,就行了。

WB_Client.Source = new Uri("http://"+"192.168.20.1"); 

  上面便是加載頁面的方法,WB_Client是控件名,192.168.20.1是學校服務器的IP。

 

  接下來便是提取頁面中的元素了:用戶名框、密碼框、確認按鈕、注銷按鈕,需要用到Microsoft.mshtml.dll,它在C:\Program Files\Microsoft.NET\Primary Interop Assemblies下。添加引用后:  

_htmlDoc = WB_Client.Document as mshtml.IHTMLDocument2;

  便能取到頁面的Document了,然后使用Chrome或者Firefox在瀏覽器上分別獲取這些控件的標識,如id、name等,在后台通過DOM獲取這些控件:

mshtml.IHTMLElement element = _htmlDoc.all.item("DDDDD");

  其中DDDDD就是控件的id或者name屬性值,得到的element有三個必用的方法:getAttribute、setAttribute、click。不用多說了吧,可以通過前兩個方法,把頁面中的值給你的WPF前台中對應的TextBox,或者從前台傳到頁面。通過click方法可以觸發頁面中的登錄按鈕,當單擊前台中的“假”Button時,在后台使用這個方法模擬登錄。

  如果說這個控件沒有id、name怎么辦,例如我這登錄后的注銷按鈕是沒有名字的,那怎么弄呢?

  使用笨辦法吧,遍歷,然后對字:

 1 mshtml.IHTMLElement element;
 2 mshtml.IHTMLElementCollection elements = _htmlDoc.all.tags("input");
 3 foreach (mshtml.IHTMLElement elm in elements)
 4 {
 5     if (elm.getAttribute("value") != "注銷")
 6     {
 7         element = elm;
 8         break;
 9     }
10 }

 

  好,基礎已經有了,那么怎么實現登錄狀態、數據保存本地呢?WebBrowser有兩個非常重要的事件可以幫助解決這些問題:Navigating、LoadCompleted。

  Navigating是在頁面開始跳轉前觸發的,這時我做一個判斷,如果能在頁面中找到“登錄”按鈕,就認為這時用戶要登錄了,便把獲取的用戶名、密碼保存到XML文件中,當然,密碼是加密保存的,取出時再解密。

  LoadCompleted是頁面跳轉后觸發的,而且此時WebBrowser的Document已經更新了,如果是用Navigated我發現將發現Document里什么HTML元素也沒有。在這個方法中,需要完成的任務包括驗證網頁的登錄狀態,設置WPF界面的顯示元素等。

  至於其它的功能:是否自動登錄、界面自動最少化、自動保存密碼、程序托盤圖標等,都比較容易實現,來看一下封裝后的東西吧:

   雖然也不是很好看,但是通過使用托盤圖標類NotifyIcon,我已經可以把這個頁面給單獨放起來了,也不會因為關閉瀏覽器而誤關了登錄會話,夠用了。

  轉載請注明原址:http://www.cnblogs.com/lekko/archive/2012/08/31/2665653.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM