掩耳盗铃之使用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