最近學校的破網越來越不像話了,換了這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